@hubspot/cli 4.2.1-beta.0 → 4.2.1-beta.2

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/bin/cli.js CHANGED
@@ -115,7 +115,7 @@ const argv = yargs
115
115
  .option('debug', {
116
116
  alias: 'd',
117
117
  default: false,
118
- describe: 'set log level to debug',
118
+ describe: 'Set log level to debug',
119
119
  type: 'boolean',
120
120
  })
121
121
  .option('noHyperlinks', {
@@ -71,7 +71,7 @@ const getPortalData = mappedPortalData => {
71
71
  };
72
72
 
73
73
  exports.handler = async options => {
74
- await loadAndValidateOptions(options);
74
+ await loadAndValidateOptions(options, false);
75
75
 
76
76
  const accountId = getAccountId(options);
77
77
 
@@ -11,7 +11,7 @@ const { loadAndValidateOptions } = require('../../lib/validation');
11
11
  const i18nKey = 'cli.commands.project.subcommands.add';
12
12
 
13
13
  exports.command = 'add';
14
- exports.describe = null; //i18n(`${i18nKey}.describe`);
14
+ exports.describe = i18n(`${i18nKey}.describe`);
15
15
 
16
16
  exports.handler = async options => {
17
17
  await loadAndValidateOptions(options);
@@ -5,7 +5,10 @@ const {
5
5
  addUseEnvironmentOptions,
6
6
  addTestingOptions,
7
7
  } = require('../../lib/commonOpts');
8
- const { trackCommandUsage } = require('../../lib/usageTracking');
8
+ const {
9
+ trackCommandUsage,
10
+ trackCommandMetadataUsage,
11
+ } = require('../../lib/usageTracking');
9
12
  const { loadAndValidateOptions } = require('../../lib/validation');
10
13
  const { i18n } = require('../../lib/lang');
11
14
  const { logger } = require('@hubspot/cli-lib/logger');
@@ -17,9 +20,10 @@ const {
17
20
  ensureProjectExists,
18
21
  handleProjectUpload,
19
22
  pollProjectBuildAndDeploy,
23
+ showPlatformVersionWarning,
20
24
  } = require('../../lib/projects');
21
25
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
22
- const { uiAccountDescription, uiLine } = require('../../lib/ui');
26
+ const { uiAccountDescription, uiBetaMessage, uiLine } = require('../../lib/ui');
23
27
  const { confirmPrompt } = require('../../lib/prompts/promptUtils');
24
28
  const {
25
29
  selectTargetAccountPrompt,
@@ -29,6 +33,7 @@ const {
29
33
  LocalDevManager,
30
34
  UPLOAD_PERMISSIONS,
31
35
  } = require('../../lib/LocalDevManager');
36
+ const LocalDevManagerV2 = require('../../lib/LocalDevManagerV2');
32
37
  const { isSandbox } = require('../../lib/sandboxes');
33
38
  const { getAccountConfig, getEnv } = require('@hubspot/cli-lib');
34
39
  const { sandboxNamePrompt } = require('../../lib/prompts/sandboxesPrompt');
@@ -38,7 +43,11 @@ const {
38
43
  getAvailableSyncTypes,
39
44
  } = require('../../lib/sandboxes');
40
45
  const { getValidEnv } = require('@hubspot/cli-lib/lib/environment');
41
- const { ERROR_TYPES } = require('@hubspot/cli-lib/lib/constants');
46
+ const {
47
+ PROJECT_BUILD_TEXT,
48
+ PROJECT_DEPLOY_TEXT,
49
+ ERROR_TYPES,
50
+ } = require('@hubspot/cli-lib/lib/constants');
42
51
  const {
43
52
  logErrorInstance,
44
53
  logApiErrorInstance,
@@ -55,7 +64,7 @@ const {
55
64
  const i18nKey = 'cli.commands.project.subcommands.dev';
56
65
 
57
66
  exports.command = 'dev [--account]';
58
- exports.describe = null; //i18n(`${i18nKey}.describe`);
67
+ exports.describe = i18n(`${i18nKey}.describe`);
59
68
 
60
69
  exports.handler = async options => {
61
70
  await loadAndValidateOptions(options);
@@ -67,13 +76,15 @@ exports.handler = async options => {
67
76
 
68
77
  const { projectConfig, projectDir } = await getProjectConfig();
69
78
 
70
- logger.log(i18n(`${i18nKey}.logs.betaMessage`));
79
+ uiBetaMessage(i18n(`${i18nKey}.logs.betaMessage`));
71
80
 
72
81
  if (!projectConfig) {
73
82
  logger.error(i18n(`${i18nKey}.errors.noProjectConfig`));
74
83
  process.exit(EXIT_CODES.ERROR);
75
84
  }
76
85
 
86
+ await showPlatformVersionWarning(accountId, projectConfig);
87
+
77
88
  const accounts = getConfigAccounts();
78
89
  let targetAccountId = options.account ? accountId : null;
79
90
  let createNewSandbox = false;
@@ -124,6 +135,13 @@ exports.handler = async options => {
124
135
  }
125
136
  try {
126
137
  const { name } = await sandboxNamePrompt(DEVELOPER_SANDBOX);
138
+
139
+ trackCommandMetadataUsage(
140
+ 'sandbox-create',
141
+ { step: 'project-dev' },
142
+ accountId
143
+ );
144
+
127
145
  const { result } = await buildSandbox({
128
146
  name,
129
147
  type: DEVELOPER_SANDBOX,
@@ -171,12 +189,13 @@ exports.handler = async options => {
171
189
  ? UPLOAD_PERMISSIONS.manual
172
190
  : UPLOAD_PERMISSIONS.always;
173
191
 
192
+ let deployedBuild;
193
+
174
194
  if (projectExists) {
175
- const { sourceIntegration } = await fetchProject(
176
- targetAccountId,
177
- projectConfig.name
178
- );
179
- if (sourceIntegration) {
195
+ const project = await fetchProject(targetAccountId, projectConfig.name);
196
+ deployedBuild = project.deployedBuild;
197
+
198
+ if (options.local || options.localAll || project.sourceIntegration) {
180
199
  uploadPermission = UPLOAD_PERMISSIONS.never;
181
200
  }
182
201
  }
@@ -253,6 +272,8 @@ exports.handler = async options => {
253
272
  );
254
273
 
255
274
  if (initialUploadResult.uploadError) {
275
+ SpinniesManager.fail('devModeSetup');
276
+
256
277
  if (
257
278
  isSpecifiedError(initialUploadResult.uploadError, {
258
279
  subCategory: ERROR_TYPES.PROJECT_LOCKED,
@@ -274,22 +295,66 @@ exports.handler = async options => {
274
295
  }
275
296
  }
276
297
 
298
+ // Let the user know when the initial build or deploy fails
299
+ // Do this before starting the dev server for v2 behavior because we cannot
300
+ // run a server on a broken project
301
+ if (
302
+ (options.local || options.localAll) &&
303
+ initialUploadResult &&
304
+ !initialUploadResult.succeeded
305
+ ) {
306
+ SpinniesManager.fail('devModeSetup');
307
+
308
+ let subTasks = [];
309
+
310
+ if (initialUploadResult.buildResult.status === 'FAILURE') {
311
+ subTasks =
312
+ initialUploadResult.buildResult[PROJECT_BUILD_TEXT.SUBTASK_KEY];
313
+ } else if (initialUploadResult.deployResult.status === 'FAILURE') {
314
+ subTasks =
315
+ initialUploadResult.deployResult[PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
316
+ }
317
+
318
+ const failedSubTasks = subTasks.filter(task => task.status === 'FAILURE');
319
+
320
+ logger.log();
321
+ failedSubTasks.forEach(failedSubTask => {
322
+ console.log(failedSubTask.errorMessage);
323
+ });
324
+ logger.log();
325
+
326
+ process.exit(EXIT_CODES.ERROR);
327
+ }
328
+
277
329
  SpinniesManager.remove('devModeSetup');
278
330
 
279
- const LocalDev = new LocalDevManager({
280
- debug: options.debug,
281
- extension: options.extension,
282
- projectConfig,
283
- projectDir,
284
- targetAccountId,
285
- uploadPermission,
286
- devServerPath: options.devServerPath,
287
- });
331
+ const LocalDev =
332
+ options.local || options.localAll
333
+ ? new LocalDevManagerV2({
334
+ alpha: options.localAll,
335
+ debug: options.debug,
336
+ deployedBuild,
337
+ projectConfig,
338
+ projectDir,
339
+ targetAccountId,
340
+ })
341
+ : new LocalDevManager({
342
+ debug: options.debug,
343
+ projectConfig,
344
+ projectDir,
345
+ targetAccountId,
346
+ uploadPermission,
347
+ });
288
348
 
289
349
  await LocalDev.start();
290
350
 
291
351
  // Let the user know when the initial build or deploy fails
292
- if (initialUploadResult && !initialUploadResult.succeeded) {
352
+ if (
353
+ !options.local &&
354
+ !options.localAll &&
355
+ initialUploadResult &&
356
+ !initialUploadResult.succeeded
357
+ ) {
293
358
  if (initialUploadResult.buildResult.status === 'FAILURE') {
294
359
  LocalDev.logBuildError(initialUploadResult.buildResult);
295
360
  } else if (initialUploadResult.deployResult.status === 'FAILURE') {
@@ -306,15 +371,15 @@ exports.builder = yargs => {
306
371
  addUseEnvironmentOptions(yargs, true);
307
372
  addTestingOptions(yargs, true);
308
373
 
309
- yargs.option('extension', {
310
- describe: i18n(`${i18nKey}.options.extension.describe`),
311
- type: 'string',
374
+ yargs.option('local', {
375
+ describe: i18n(`${i18nKey}.options.local.describe`),
376
+ type: 'boolean',
312
377
  hidden: true,
313
378
  });
314
379
 
315
- yargs.option('devServerPath', {
316
- describe: i18n(`${i18nKey}.options.devServerPath.describe`),
317
- type: 'string',
380
+ yargs.option('local-all', {
381
+ describe: i18n(`${i18nKey}.options.localAll.describe`),
382
+ type: 'boolean',
318
383
  hidden: true,
319
384
  });
320
385
 
@@ -7,6 +7,7 @@ const {
7
7
  addUseEnvironmentOptions,
8
8
  } = require('../../lib/commonOpts');
9
9
  const { trackCommandUsage } = require('../../lib/usageTracking');
10
+ const { i18n } = require('../../lib/lang');
10
11
  const {
11
12
  logApiErrorInstance,
12
13
  ApiErrorContext,
@@ -31,8 +32,10 @@ const {
31
32
  const moment = require('moment');
32
33
  const { promptUser } = require('../../lib/prompts/promptUtils');
33
34
 
35
+ const i18nKey = 'cli.commands.project.subcommands.listBuilds';
36
+
34
37
  exports.command = 'list-builds [path]';
35
- exports.describe = false;
38
+ exports.describe = i18n(`${i18nKey}.describe`);
36
39
 
37
40
  exports.handler = async options => {
38
41
  await loadAndValidateOptions(options);
@@ -16,6 +16,7 @@ const {
16
16
  logFeedbackMessage,
17
17
  validateProjectConfig,
18
18
  pollProjectBuildAndDeploy,
19
+ showPlatformVersionWarning,
19
20
  } = require('../../lib/projects');
20
21
  const { i18n } = require('../../lib/lang');
21
22
  const { getAccountConfig } = require('@hubspot/cli-lib');
@@ -48,6 +49,8 @@ exports.handler = async options => {
48
49
 
49
50
  validateProjectConfig(projectConfig, projectDir);
50
51
 
52
+ await showPlatformVersionWarning(accountId, projectConfig);
53
+
51
54
  await ensureProjectExists(accountId, projectConfig.name, { forceCreate });
52
55
 
53
56
  try {
@@ -21,6 +21,7 @@ const {
21
21
  pollDeployStatus,
22
22
  validateProjectConfig,
23
23
  logFeedbackMessage,
24
+ showPlatformVersionWarning,
24
25
  } = require('../../lib/projects');
25
26
  const {
26
27
  cancelStagedBuild,
@@ -97,6 +98,8 @@ exports.handler = async options => {
97
98
 
98
99
  validateProjectConfig(projectConfig, projectDir);
99
100
 
101
+ await showPlatformVersionWarning(accountId, projectConfig);
102
+
100
103
  await ensureProjectExists(accountId, projectConfig.name);
101
104
 
102
105
  try {
@@ -1,4 +1,5 @@
1
1
  const { addConfigOptions, addAccountOptions } = require('../lib/commonOpts');
2
+ const { i18n } = require('../lib/lang');
2
3
  const deploy = require('./project/deploy');
3
4
  const create = require('./project/create');
4
5
  const upload = require('./project/upload');
@@ -10,24 +11,26 @@ const open = require('./project/open');
10
11
  const dev = require('./project/dev');
11
12
  const add = require('./project/add');
12
13
 
14
+ const i18nKey = 'cli.commands.project';
15
+
13
16
  exports.command = 'project';
14
- exports.describe = false; //'Commands for working with projects';
17
+ exports.describe = i18n(`${i18nKey}.describe`);
15
18
 
16
19
  exports.builder = yargs => {
17
20
  addConfigOptions(yargs, true);
18
21
  addAccountOptions(yargs, true);
19
22
 
20
23
  // TODO: deploy must be updated
21
- yargs.command(deploy).demandCommand(1, '');
22
24
  yargs.command(create).demandCommand(0, '');
23
- yargs.command(upload).demandCommand(0, '');
25
+ yargs.command(add).demandCommand(0, '');
24
26
  yargs.command(watch).demandCommand(0, '');
25
- yargs.command(listBuilds).demandCommand(0, '');
27
+ yargs.command(dev).demandCommand(0, '');
28
+ yargs.command(upload).demandCommand(0, '');
29
+ yargs.command(deploy).demandCommand(1, '');
26
30
  yargs.command(logs).demandCommand(1, '');
31
+ yargs.command(listBuilds).demandCommand(0, '');
27
32
  yargs.command(download).demandCommand(0, '');
28
33
  yargs.command(open).demandCommand(0, '');
29
- yargs.command(dev).demandCommand(0, '');
30
- yargs.command(add).demandCommand(0, '');
31
34
 
32
35
  return yargs;
33
36
  };
@@ -22,7 +22,10 @@ const {
22
22
  } = require('../../lib/sandboxes');
23
23
  const { getValidEnv } = require('@hubspot/cli-lib/lib/environment');
24
24
  const { logger } = require('@hubspot/cli-lib/logger');
25
- const { trackCommandUsage } = require('../../lib/usageTracking');
25
+ const {
26
+ trackCommandUsage,
27
+ trackCommandMetadataUsage,
28
+ } = require('../../lib/usageTracking');
26
29
  const {
27
30
  sandboxTypePrompt,
28
31
  sandboxNamePrompt,
@@ -153,6 +156,12 @@ exports.handler = async options => {
153
156
  // Prompt user to sync assets after sandbox creation
154
157
  const sandboxAccountConfig = getAccountConfig(result.sandbox.sandboxHubId);
155
158
  const handleSyncSandbox = async syncTasks => {
159
+ // Send tracking event for secondary action, in this case a sandbox sync within the sandbox create flow
160
+ trackCommandMetadataUsage(
161
+ 'sandbox-sync',
162
+ { step: 'sandbox-create' },
163
+ result.sandbox.sandboxHubId
164
+ );
156
165
  await syncSandbox({
157
166
  accountConfig: sandboxAccountConfig,
158
167
  parentAccountConfig: accountConfig,
@@ -168,19 +168,15 @@ exports.handler = async options => {
168
168
  } catch (err) {
169
169
  debugErrorAndContext(err);
170
170
 
171
- if (err instanceof HubSpotAuthError) {
171
+ if (err instanceof HubSpotAuthError && err.statusCode === 401) {
172
172
  // Intercept invalid key error
173
173
  // This command uses the parent portal PAK to delete a sandbox, so we must specify which account needs a new key
174
- const regex = /\bYour personal access key is invalid\b/;
175
- const match = err.message.match(regex);
176
- if (match && match[0]) {
177
- logger.log('');
178
- logger.error(
179
- i18n(`${i18nKey}.failure.invalidKey`, {
180
- account: getAccountName(parentAccount),
181
- })
182
- );
183
- }
174
+ logger.log('');
175
+ logger.error(
176
+ i18n(`${i18nKey}.failure.invalidKey`, {
177
+ account: getAccountName(parentAccount),
178
+ })
179
+ );
184
180
  } else if (
185
181
  isSpecifiedError(err, {
186
182
  statusCode: 403,
package/lang/en.lyaml CHANGED
@@ -444,11 +444,12 @@ en:
444
444
  describe: "Shortcut of the link you'd like to open"
445
445
  selectLink: "Select a link to open"
446
446
  project:
447
+ describe: "{{#bold}}[beta]{{/bold}} Commands for working with projects. For more information, visit our documentation: https://developers.hubspot.com/docs/platform/build-and-deploy-using-hubspot-projects"
447
448
  subcommands:
448
449
  dev:
449
- describe: "Start local dev for the current project"
450
+ describe: "{{#bold}}[beta]{{/bold}} Start local dev for the current project"
450
451
  logs:
451
- betaMessage: "{{#yellow}}{{#bold}}[beta]{{/bold}}{{/yellow}} HubSpot projects local development"
452
+ betaMessage: "HubSpot projects local development"
452
453
  nonSandboxWarning: "Testing in a sandbox is strongly recommended. To switch the target account, select an option below or run {{#bold}}`hs accounts use`{{/bold}} before running the command again."
453
454
  placeholderAccountSelection: "Using default account as target account (for now)"
454
455
  projectMustExistExplanation: "The project {{ projectName }} does not exist in the target account {{ accountIdentifier}}. This command requires the project to exist in the target account."
@@ -461,19 +462,18 @@ en:
461
462
  startupMessage: "Starting local dev server for {{#bold}}{{ projectName }}{{/bold}} ..."
462
463
  prompt:
463
464
  createProject: "Create new project {{ projectName}} in {{#bold}}[{{ accountIdentifier }}]{{/bold}}?"
464
- targetNonSandbox: "Continue testing in a non-sandbox account?"
465
465
  options:
466
- extension:
467
- describe: "The extension that you would like to run locally"
468
- devServerPath:
469
- describe: "Relative path to the dev server interface file"
466
+ local:
467
+ describe: "Run the alpha version of this command with some local dev server functionality"
468
+ localAll:
469
+ describe: "Run the alpha version of this command with all local dev server functionality"
470
470
  errors:
471
471
  noProjectConfig: "No project detected. Please run this command again from a project directory."
472
472
  projectLockedError: "Your project is locked. This may mean that another user is running the {{#bold}}`hs project dev`{{/bold}} command for this project. If this is you, unlock the project in Projects UI."
473
473
  examples:
474
474
  default: "Start local dev for the current project"
475
475
  create:
476
- describe: "Create a new project"
476
+ describe: "{{#bold}}[beta]{{/bold}} Create a new project"
477
477
  logs:
478
478
  welcomeMessage: "Welcome to HubSpot Developer Projects!"
479
479
  examples:
@@ -488,7 +488,7 @@ en:
488
488
  templateSource:
489
489
  describe: "Path to custom GitHub repository from which to create project template"
490
490
  add:
491
- describe: "Create a new component within a project"
491
+ describe: "{{#bold}}[beta]{{/bold}} Create a new component within a project"
492
492
  options:
493
493
  name:
494
494
  describe: "Component name"
@@ -503,7 +503,7 @@ en:
503
503
  examples:
504
504
  default: "Create a component within your project"
505
505
  deploy:
506
- describe: "Deploy a project build"
506
+ describe: "{{#bold}}[beta]{{/bold}} Deploy a project build"
507
507
  debug:
508
508
  deploying: "Deploying project at path: {{ path }}"
509
509
  errors:
@@ -518,8 +518,10 @@ en:
518
518
  describe: "Project build ID to be deployed"
519
519
  project:
520
520
  describe: "Project name"
521
+ listBuilds:
522
+ describe: "{{#bold}}[beta]{{/bold}} List the project's builds"
521
523
  logs:
522
- describe: "Get execution logs for a serverless function within a project"
524
+ describe: "{{#bold}}[beta]{{/bold}} Get execution logs for a serverless function within a project"
523
525
  errors:
524
526
  invalidAppName: "Could not find app with name \"{{ appName }}\" in project \"{{ projectName }}\""
525
527
  logs:
@@ -554,7 +556,7 @@ en:
554
556
  endpoint:
555
557
  describe: "Public endpoint path"
556
558
  upload:
557
- describe: "Upload your project files and create a new build"
559
+ describe: "{{#bold}}[beta]{{/bold}} Upload your project files and create a new build"
558
560
  examples:
559
561
  default: "Upload a project"
560
562
  logs:
@@ -572,7 +574,7 @@ en:
572
574
  path:
573
575
  describe: "Path to a project folder"
574
576
  watch:
575
- describe: "Watch your local project for changes and automatically upload changed files to a new build in HubSpot"
577
+ describe: "{{#bold}}[beta]{{/bold}} Watch your local project for changes and automatically upload changed files to a new build in HubSpot"
576
578
  examples:
577
579
  default: "Watch a project within the myProjectFolder folder"
578
580
  logs:
@@ -584,7 +586,7 @@ en:
584
586
  initialUpload:
585
587
  describe: "Upload directory before watching for updates"
586
588
  download:
587
- describe: "Download your project files from HubSpot and write to a path on your computer"
589
+ describe: "{{#bold}}[beta]{{/bold}} Download your project files from HubSpot and write to a path on your computer"
588
590
  examples:
589
591
  default: "Download the project myProject into myProjectFolder folder"
590
592
  logs:
@@ -601,7 +603,7 @@ en:
601
603
  dest:
602
604
  describe: "Destination folder for the project"
603
605
  open:
604
- describe: "Open available projects for the specified account"
606
+ describe: "{{#bold}}[beta]{{/bold}} Open the specified project's details page in the browser"
605
607
  options:
606
608
  project:
607
609
  describe: "Name of project to open"
@@ -850,6 +852,30 @@ en:
850
852
  lib:
851
853
  DevServerManager:
852
854
  portConflict: "The port {{ port }} is already in use."
855
+ notInitialized: "The Dev Server Manager must be initialized before it is started."
856
+ noCompatibleComponents: "Skipping call to {{ serverKey }} because there are no compatible components in the project."
857
+ LocalDevManagerV2:
858
+ failedToInitialize: "Missing required arguments to initialize Local Dev"
859
+ noComponents: "There are no components in this project."
860
+ noRunnableComponents: "There are no components in this project that support local development."
861
+ betaMessage: "HubSpot projects local development"
862
+ running: "Running {{#bold}}{{ projectName }}{{/bold}} locally on {{ accountIdentifier }}, waiting for changes ..."
863
+ quitHelper: "Press {{#bold}}'q'{{/bold}} to stop the local dev server"
864
+ viewInHubSpotLink: "View in HubSpot"
865
+ exitingStart: "Stopping local dev server ..."
866
+ exitingSucceed: "Successfully exited"
867
+ exitingFail: "Failed to cleanup before exiting"
868
+ uploadWarning:
869
+ missingComponents: "Your deployed project does not contain the components {{#bold}}'{{ missingComponents }}'{{/bold}}. This may cause issues in local development."
870
+ header: "{{ reason }} To reflect these changes:"
871
+ stopDev: " * Stop {{#bold}}`hs project dev`{{/bold}}"
872
+ runUpload: " * Run {{#bold}}`hs project upload`{{/bold}}"
873
+ runUploadWithAccount: " * Run {{#bold}}`hs project upload --account={{ accountId }}`{{/bold}}"
874
+ restartDev: " * Re-run {{#bold}}`hs project dev`{{/bold}}"
875
+ devServer:
876
+ cleanupError: "Failed to cleanup local dev server: {{ message }}"
877
+ setupError: "Failed to setup local dev server: {{ message }}"
878
+ startError: "Failed to start local dev server: {{ message }}"
853
879
  LocalDevManager:
854
880
  failedToInitialize: "Missing required arguments to initialize Local Dev Manager"
855
881
  exitingStart: "Stopping local dev server ..."
@@ -859,7 +885,7 @@ en:
859
885
  cancelledFromUI: "The dev process has been cancelled from the UI. Any changes made since cancelling have not been uploaded. To resume dev mode, rerun {{#yellow}}`hs project dev`{{/yellow}}."
860
886
  header:
861
887
  betaMessage: "{{#yellow}}{{#bold}}[beta]{{/bold}}{{/yellow}} HubSpot projects local development"
862
- running: "Running {{ projectName}} locally on {{ accountIdentifier }}, waiting for changes ..."
888
+ running: "Running {{#bold}}{{ projectName }}{{/bold}} locally on {{ accountIdentifier }}, waiting for changes ..."
863
889
  quitHelper: "Press {{#bold}}'q'{{/bold}} to stop the local dev server"
864
890
  viewInHubSpotLink: "View in HubSpot"
865
891
  status:
@@ -915,7 +941,11 @@ en:
915
941
  logFeedbackMessage:
916
942
  feedbackHeader: "We'd love to hear your feedback!"
917
943
  feedbackMessage: "How are you liking the new projects and developer tools? \n > Run `{{#yellow}}hs feedback{{/yellow}}` to let us know what you think!\n"
944
+ showPlatformVersionWarning:
945
+ noPlatformVersion: "No platformVersion found in hsproject.json. Falling back to version \"{{ defaultVersion }}\"."
946
+ noPlatformVersionAlt: "No platformVersion found in hsproject.json. Falling back to default version."
918
947
  ui:
948
+ betaTag: "{{#bold}}[beta]{{/bold}}"
919
949
  betaWarning:
920
950
  header: "{{#yellow}}***************************** WARNING ****************************{{/yellow}}"
921
951
  footer: "{{#yellow}}******************************************************************{{/yellow}}"