@contrail/cli 3.1.3 → 3.1.6

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 (36) hide show
  1. package/README.md +3 -2
  2. package/dist/commands/app/delete.js +1 -1
  3. package/dist/commands/app/extension/deploy.d.ts +1 -0
  4. package/dist/commands/app/extension/deploy.js +6 -1
  5. package/dist/commands/app/extension/deployment/list.js +1 -1
  6. package/dist/commands/app/install.js +5 -5
  7. package/dist/commands/app/publish.js +2 -2
  8. package/dist/commands/app/uninstall.js +2 -2
  9. package/dist/commands/app/upgrade.js +3 -3
  10. package/dist/commands/file/upload.js +5 -4
  11. package/dist/commands/groups/export.js +5 -4
  12. package/dist/commands/groups/import.js +5 -5
  13. package/dist/commands/projects/export.js +5 -5
  14. package/dist/commands/projects/list.js +5 -5
  15. package/dist/commands/projects/load.js +5 -5
  16. package/dist/commands/types/getOptionSets.js +4 -4
  17. package/dist/commands/types/mergeOptionSets.js +4 -4
  18. package/dist/commands/types/mergeTypeProperties.js +4 -4
  19. package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.js +2 -2
  20. package/dist/commands/types/parseOptionSetsLocalFiles.js +6 -6
  21. package/dist/commands/types/parseOptionSetsToFolderStructure.js +2 -2
  22. package/dist/commands/types/parseTypesFromFiles.js +2 -2
  23. package/dist/commands/types/parseTypesFromLocalFiles.js +2 -2
  24. package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.js +2 -2
  25. package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.js +2 -2
  26. package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.js +1 -1
  27. package/dist/commands/types/uploadTypePropertyPolicies.js +1 -1
  28. package/dist/commands/users/export.js +4 -4
  29. package/dist/commands/users/import.js +5 -5
  30. package/dist/commands/workflow-templates/export.js +4 -4
  31. package/dist/helpers/app/extension-package.d.ts +3 -1
  32. package/dist/helpers/app/extension-package.js +10 -20
  33. package/dist/helpers/app/extensions-deployer.js +1 -1
  34. package/dist/helpers/workflow-templates/helper.js +5 -5
  35. package/oclif.manifest.json +8 -1
  36. package/package.json +1 -1
package/README.md CHANGED
@@ -17,7 +17,7 @@ $ npm install -g @contrail/cli
17
17
  $ contrail COMMAND
18
18
  running command...
19
19
  $ contrail (--version)
20
- @contrail/cli/3.1.3 darwin-arm64 node-v20.18.0
20
+ @contrail/cli/3.1.6 darwin-arm64 node-v20.18.0
21
21
  $ contrail --help [COMMAND]
22
22
  USAGE
23
23
  $ contrail COMMAND
@@ -147,9 +147,10 @@ Deploy an extension from the extensions directory to a VibeIQ managed URL.
147
147
 
148
148
  ```
149
149
  USAGE
150
- $ contrail app extension deploy -i <value> [-l error|warn|info|debug] [-e true|false]
150
+ $ contrail app extension deploy -i <value> [-l error|warn|info|debug] [-e true|false] [-d]
151
151
 
152
152
  FLAGS
153
+ -d, --debug Enable debug mode
153
154
  -e, --alwaysConfirmEnv=<option> [default: true] The Environment variables
154
155
  <options: true|false>
155
156
  -i, --identifier=<value> (required) The extension identifier to deploy. The identifier of the extension is the
@@ -23,7 +23,7 @@ class DeleteApp extends basecommand_1.BaseCommand {
23
23
  appDeclaration = (0, load_app_config_1.loadAppConfig)();
24
24
  }
25
25
  catch (e) {
26
- logger_1.default.error(`%s Application Removal Failed. ${e}`);
26
+ logger_1.default.error(`${e} Application Removal Failed.`);
27
27
  return;
28
28
  }
29
29
  logger_1.default.info(`Removing Application. ${appDeclaration.appIdentifier}`);
@@ -4,6 +4,7 @@ export default class DeployExtension extends BaseCommand {
4
4
  static examples: string[];
5
5
  static flags: {
6
6
  identifier: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
7
+ debug: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
7
8
  alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
8
9
  logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
9
10
  };
@@ -24,6 +24,11 @@ class DeployExtension extends basecommand_1.BaseCommand {
24
24
  description: 'The extension identifier to deploy. The identifier of the extension is the "identifier" property in the extension defined in the app.yml',
25
25
  required: true,
26
26
  }),
27
+ debug: core_1.Flags.boolean({
28
+ char: 'd',
29
+ description: 'Enable debug mode',
30
+ default: false,
31
+ }),
27
32
  };
28
33
  async run() {
29
34
  await (0, login_1.authUser)();
@@ -35,7 +40,7 @@ class DeployExtension extends basecommand_1.BaseCommand {
35
40
  await this.validateExtensionDeclaration(appDeclaration, extensionIdentifier);
36
41
  const extensionDir = this.getExtensionDirectory(extensionIdentifier);
37
42
  // 2. Package and upload extension
38
- const createdPackage = await (0, extension_package_1.createExtensionPackage)(app.id, extensionDir);
43
+ const createdPackage = await (0, extension_package_1.createExtensionPackage)(app.id, extensionDir, { debug: this.flags.debug });
39
44
  // 3. Poll until package is ready (timeout after 1 minute)
40
45
  const readyPackage = await this.pollUntilPackageIsReady(createdPackage);
41
46
  logger_1.default.info("Extension package is ready...Checking for extension deployment");
@@ -24,7 +24,7 @@ class ListExtensionDeployments extends basecommand_1.BaseCommand {
24
24
  };
25
25
  async run() {
26
26
  await (0, login_1.authUser)();
27
- logger_1.default.info(`%s Listing extension deployments`, chalk_1.default.blue.bold('START'));
27
+ logger_1.default.info(`${chalk_1.default.blue.bold('START')} Listing extension deployments.`);
28
28
  const appDeclaration = (0, load_app_config_1.loadAppConfig)();
29
29
  const app = await (0, extension_package_1.getExistingApp)(appDeclaration);
30
30
  const packages = this.flags.all
@@ -65,7 +65,7 @@ class InstallApp extends basecommand_1.BaseCommand {
65
65
  if (app.configProperties) {
66
66
  configProperties = await getConfigProperties(app);
67
67
  }
68
- logger_1.default.info('%s Installing app', chalk_1.default.green.bold('APP INSTALLATION'));
68
+ logger_1.default.info(`${chalk_1.default.green.bold('APP INSTALLATION')} Installing app`);
69
69
  const appOrg = await (0, apps_1.installAppToOrg)(app, configProperties);
70
70
  // eslint-disable-next-line no-constant-condition
71
71
  while (true) {
@@ -73,17 +73,17 @@ class InstallApp extends basecommand_1.BaseCommand {
73
73
  try {
74
74
  const installingApp = await new sdk_1.Entities().get({ entityName: 'app-org', id: appOrg.id });
75
75
  if (installingApp.status === 'READY') {
76
- logger_1.default.info('%s App installed', chalk_1.default.green.bold('APP INSTALLATION'));
76
+ logger_1.default.info(`${chalk_1.default.green.bold('APP INSTALLATION')} App installed`);
77
77
  break;
78
78
  }
79
79
  if (installingApp.status === 'FAILED_INSTALLING') {
80
- logger_1.default.info('%s App installation failed', chalk_1.default.red.bold('APP INSTALLATION'));
80
+ logger_1.default.info(`${chalk_1.default.red.bold('APP INSTALLATION')} App installation failed`);
81
81
  return;
82
82
  }
83
83
  process.stdout.write('.');
84
84
  }
85
85
  catch (e) {
86
- logger_1.default.info('%s App installation failed', chalk_1.default.red.bold('APP INSTALLATION'));
86
+ logger_1.default.info(`${chalk_1.default.red.bold('APP INSTALLATION')} App installation failed`);
87
87
  logger_1.default.info('Error is:', e);
88
88
  return;
89
89
  }
@@ -98,7 +98,7 @@ class InstallApp extends basecommand_1.BaseCommand {
98
98
  },
99
99
  ]);
100
100
  if (!answers.shouldInstallWorkflows) {
101
- logger_1.default.info('%s Not installing associated app workflows', chalk_1.default.yellow.bold('APP INSTALLATION'));
101
+ logger_1.default.info(`${chalk_1.default.yellow.bold('APP INSTALLATION')} Not installing associated app workflows`);
102
102
  this.flags.installWorkflowTemplates = false;
103
103
  }
104
104
  else {
@@ -45,7 +45,7 @@ class PublishApp extends basecommand_1.BaseCommand {
45
45
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Application Deployment Failed . ${e}`);
46
46
  return;
47
47
  }
48
- logger_1.default.info(`%s Deploying Application. ${appDeclaration.appIdentifier}`, chalk_1.default.blue.bold('START'));
48
+ logger_1.default.info(`${chalk_1.default.blue.bold('START')} Deploying Application. ${appDeclaration.appIdentifier}`);
49
49
  try {
50
50
  await (0, login_1.authUser)();
51
51
  const app = await new app_deployer_1.AppDeployer(this.flags.verbose, this.flags.dryRun).deploy(appDeclaration);
@@ -57,7 +57,7 @@ class PublishApp extends basecommand_1.BaseCommand {
57
57
  return;
58
58
  }
59
59
  await (0, upgrade_1.upgradeAndWait)(installedAppOrg, app.latestAppVersionId);
60
- logger_1.default.info('%s App upgraded.', chalk_1.default.green.bold('UPGRADED'));
60
+ logger_1.default.info(`${chalk_1.default.green.bold('UPGRADED')} App upgraded.`);
61
61
  }
62
62
  }
63
63
  catch (e) {
@@ -43,7 +43,7 @@ class UninstallApp extends basecommand_1.BaseCommand {
43
43
  if (!appToDelete) {
44
44
  throw new Error(`App ${this.flags.appIdentifier} not found`);
45
45
  }
46
- this.log('%s Uninstalling app', chalk_1.default.green.bold('APP UNINSTALLATION'));
46
+ this.log(`${chalk_1.default.green.bold('APP UNINSTALLATION')} Uninstalling app`);
47
47
  await (0, apps_1.deleteAppOrg)(appToDelete.id);
48
48
  // eslint-disable-next-line no-constant-condition
49
49
  while (true) {
@@ -63,7 +63,7 @@ class UninstallApp extends basecommand_1.BaseCommand {
63
63
  break;
64
64
  }
65
65
  }
66
- this.log('%s App Uninstalled', chalk_1.default.green.bold('APP UNINSTALLATION'));
66
+ this.log(`${chalk_1.default.green.bold('APP UNINSTALLATION')} App Uninstalled`);
67
67
  }
68
68
  }
69
69
  exports.default = UninstallApp;
@@ -81,7 +81,7 @@ class UpgradeApp extends basecommand_1.BaseCommand {
81
81
  ]);
82
82
  versionToUpgrade = answers.appVersion;
83
83
  }
84
- this.log(`%s Upgrading app to version ${versionToUpgrade}`, chalk_1.default.green.bold('APP UPGRADE'));
84
+ this.log(`${chalk_1.default.green.bold('APP UPGRADE')} Upgrading app to version ${versionToUpgrade}`);
85
85
  await upgradeAndWait(appOrgToUpgrade, versionToUpgrade);
86
86
  }
87
87
  }
@@ -96,11 +96,11 @@ async function upgradeAndWait(appOrgToUpgrade, versionToUpgrade) {
96
96
  id: appOrgToUpgrade.id,
97
97
  });
98
98
  if (appStillUpgrading.status === 'READY') {
99
- logger_1.default.info('%s App Upgraded', chalk_1.default.green.bold('APP UPGRADE'));
99
+ logger_1.default.info(`${chalk_1.default.green.bold('APP UPGRADE')} App Upgraded`);
100
100
  return;
101
101
  }
102
102
  if (appStillUpgrading.status === 'FAILED_INSTALLING') {
103
- logger_1.default.info('%s App Upgrade FAILED!', chalk_1.default.red.bold('APP UPGRADE'));
103
+ logger_1.default.info(`${chalk_1.default.red.bold('APP UPGRADE')} App Upgrade FAILED!`);
104
104
  return;
105
105
  }
106
106
  logger_1.default.info('checking app status...');
@@ -32,15 +32,16 @@ class UploadFile extends basecommand_1.BaseCommand {
32
32
  async run() {
33
33
  try {
34
34
  await (0, login_1.authUser)();
35
- this.log('%s Uploading File.', chalk_1.default.blue.bold('START'));
35
+ this.log(`${chalk_1.default.blue.bold('START')} Uploading File.`);
36
+ this.log(`${chalk_1.default.yellow.bold('FILE')} Uploading`);
36
37
  await uploadFile(this.args.fileLocation, this.args.contentType);
37
- this.log('%s Uploaded', chalk_1.default.yellow.bold('FILE'));
38
+ this.log(`${chalk_1.default.yellow.bold('FILE')} Uploaded`);
38
39
  }
39
40
  catch (e) {
40
- this.log(`%s User Upload Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
41
+ this.log(`${chalk_1.default.red.bold('FAIL')} User Upload Failed. ${e}`);
41
42
  return;
42
43
  }
43
- this.log('%s User Upload Complete.', chalk_1.default.green.bold('COMPLETE'));
44
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} User Upload Complete.`);
44
45
  }
45
46
  }
46
47
  exports.default = UploadFile;
@@ -36,15 +36,16 @@ class ExportGroups extends basecommand_1.BaseCommand {
36
36
  async run() {
37
37
  try {
38
38
  await (0, login_1.authUser)();
39
- this.log('%s Getting Groups.', chalk_1.default.blue.bold('START'));
39
+ this.log(`${chalk_1.default.blue.bold('START')} Getting Groups.`);
40
+ this.log(`${chalk_1.default.yellow.bold('GROUPS')} Exporting`);
40
41
  await exportGroups(this.flags.outFile ?? exports.DEFAULT_FILE_LOCATION, this.flags.overwrite);
41
- this.log('%s Done', chalk_1.default.yellow.bold('GROUPS'));
42
+ this.log(`${chalk_1.default.yellow.bold('GROUPS')} Exported`);
42
43
  }
43
44
  catch (e) {
44
- this.log(`%s Groups download Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
45
+ this.log(`${chalk_1.default.red.bold('FAIL')} Groups download Failed. ${e}`);
45
46
  return;
46
47
  }
47
- this.log('%s Groups download Complete.', chalk_1.default.green.bold('COMPLETE'));
48
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Groups download Complete.`);
48
49
  }
49
50
  }
50
51
  exports.default = ExportGroups;
@@ -26,16 +26,16 @@ class ImportGroups extends basecommand_1.BaseCommand {
26
26
  async run() {
27
27
  try {
28
28
  await (0, login_1.authUser)();
29
- this.log('%s Uploading Groups.', chalk_1.default.blue.bold('START'));
30
- this.log('%s Uploading', chalk_1.default.yellow.bold('GROUP'));
29
+ this.log(`${chalk_1.default.blue.bold('START')} Uploading Groups.`);
30
+ this.log(`${chalk_1.default.yellow.bold('GROUP')} Uploading`);
31
31
  await uploadGroups(this.args.groupsFile);
32
- this.log('%s Uploaded', chalk_1.default.yellow.bold('GROUP'));
32
+ this.log(`${chalk_1.default.yellow.bold('GROUP')} Uploaded`);
33
33
  }
34
34
  catch (e) {
35
- this.log(`%s Group Upload Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
35
+ this.log(`${chalk_1.default.red.bold('FAIL')} Group Upload Failed. ${e}`);
36
36
  return;
37
37
  }
38
- this.log('%s Group Upload Complete.', chalk_1.default.green.bold('COMPLETE'));
38
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Group Upload Complete.`);
39
39
  }
40
40
  }
41
41
  exports.default = ImportGroups;
@@ -21,16 +21,16 @@ class ExportProjects extends basecommand_1.BaseCommand {
21
21
  async run() {
22
22
  try {
23
23
  await (0, login_1.authUser)();
24
- this.log('%s Exporting Project.', chalk_1.default.blue.bold('START'));
25
- this.log('%s Exporting', chalk_1.default.yellow.bold('PROJECT'));
24
+ this.log(`${chalk_1.default.blue.bold('START')} Exporting Project.`);
25
+ this.log(`${chalk_1.default.yellow.bold('PROJECT')} Exporting`);
26
26
  await (0, helpers_1.exportProject)(this.args.projectName);
27
- this.log('%s Exported', chalk_1.default.yellow.bold('PROJECT'));
27
+ this.log(`${chalk_1.default.yellow.bold('PROJECT')} Exported`);
28
28
  }
29
29
  catch (e) {
30
- this.log(`%s Project Export Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
30
+ this.log(`${chalk_1.default.red.bold('FAIL')} Project Export Failed. ${e}`);
31
31
  return;
32
32
  }
33
- this.log('%s Project Export Complete.', chalk_1.default.green.bold('COMPLETE'));
33
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Project Export Complete.`);
34
34
  }
35
35
  }
36
36
  exports.default = ExportProjects;
@@ -17,21 +17,21 @@ class ListProjects extends basecommand_1.BaseCommand {
17
17
  async run() {
18
18
  try {
19
19
  await (0, login_1.authUser)();
20
- this.log('%s Getting Projects.', chalk_1.default.blue.bold('START'));
20
+ this.log(`${chalk_1.default.blue.bold('START')} Getting Projects.`);
21
21
  const allWorkspaces = await new sdk_1.Entities().get({
22
22
  entityName: 'workspace',
23
23
  criteria: { isArchived: false },
24
24
  });
25
- this.log('%s', chalk_1.default.green.bold('PROJECTS:'));
25
+ this.log(`${chalk_1.default.green.bold('PROJECTS:')}`);
26
26
  //this.log(allWorkspaces.map(w => Object.assign({}, {name: w.name, id: w.id}))); // if we want ids
27
27
  this.log(allWorkspaces.map((w) => w.name));
28
- this.log('%s Done', chalk_1.default.yellow.bold('PROJECTS'));
28
+ this.log(`${chalk_1.default.yellow.bold('PROJECTS')} Done`);
29
29
  }
30
30
  catch (e) {
31
- this.log(`%s Project download Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
31
+ this.log(`${chalk_1.default.red.bold('FAIL')} Project download Failed. ${e}`);
32
32
  return;
33
33
  }
34
- this.log('%s Project download Complete.', chalk_1.default.green.bold('COMPLETE'));
34
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Project download Complete.`);
35
35
  }
36
36
  }
37
37
  exports.default = ListProjects;
@@ -27,18 +27,18 @@ class LoadProject extends basecommand_1.BaseCommand {
27
27
  async run() {
28
28
  try {
29
29
  await (0, login_1.authUser)();
30
- this.log('%s Parsing Template.', chalk_1.default.blue.bold('START'));
31
- this.log('%s Uploading', chalk_1.default.yellow.bold('PROJECT'));
30
+ this.log(`${chalk_1.default.blue.bold('START')} Parsing Template.`);
31
+ this.log(`${chalk_1.default.yellow.bold('PROJECT')} Uploading`);
32
32
  const templateFileLocation = this.args.templateFileLocation;
33
33
  this.log('Using Template File Location: ', this.args.templateFileLocation);
34
34
  await uploadProject(templateFileLocation);
35
- this.log('%s Uploaded', chalk_1.default.yellow.bold('PROJECT'));
35
+ this.log(`${chalk_1.default.yellow.bold('PROJECT')} Uploaded`);
36
36
  }
37
37
  catch (e) {
38
- this.log(`%s Project Upload Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
38
+ this.log(`${chalk_1.default.red.bold('FAIL')} Project Upload Failed. ${e}`);
39
39
  return;
40
40
  }
41
- this.log('%s Project Upload Complete.', chalk_1.default.green.bold('COMPLETE'));
41
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Project Upload Complete.`);
42
42
  }
43
43
  }
44
44
  exports.default = LoadProject;
@@ -44,7 +44,7 @@ exports.default = GetOptionSets;
44
44
  async function getAllOptionSets(outDir, overwrite, format) {
45
45
  try {
46
46
  const userConfig = await (0, login_1.authUser)();
47
- logger_1.default.info(`%s Getting all Option Sets for orgId: ${userConfig.orgId}`, chalk_1.default.blue.bold('START'));
47
+ logger_1.default.info(`${chalk_1.default.yellow.bold('START')} Getting all Option Sets for orgId: ${userConfig.orgId}`);
48
48
  // make directory to house exports
49
49
  if (!fs_1.default.existsSync(path.resolve(outDir))) {
50
50
  fs_1.default.mkdirSync(path.resolve(outDir));
@@ -54,13 +54,13 @@ async function getAllOptionSets(outDir, overwrite, format) {
54
54
  };
55
55
  const reducedData = await reduceData(data);
56
56
  await saveData(reducedData, outDir, overwrite, format);
57
- logger_1.default.info('%s Retrieved', chalk_1.default.yellow.bold('OPTION SETS'));
57
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SETS')} Retrieved`);
58
58
  }
59
59
  catch (e) {
60
- logger_1.default.info(`%s Option Sets Retrieval Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
60
+ logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Option Sets Retrieval Failed. ${e}`);
61
61
  return;
62
62
  }
63
- logger_1.default.info('%s Option Sets Retrieval Complete.', chalk_1.default.green.bold('COMPLETE'));
63
+ logger_1.default.info(`${chalk_1.default.green.bold('COMPLETE')} Option Sets Retrieval Complete.`);
64
64
  }
65
65
  exports.getAllOptionSets = getAllOptionSets;
66
66
  async function reduceData(data) {
@@ -24,16 +24,16 @@ class MergeOptionSets extends basecommand_1.BaseCommand {
24
24
  };
25
25
  async run() {
26
26
  try {
27
- this.log('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET MERGE'));
27
+ this.log(`${chalk_1.default.yellow.bold('OPTION SET MERGE')} Importing local file`);
28
28
  this.log('Using File: ', this.args.file);
29
29
  await mergeOptionSets(this.args.file);
30
- this.log('%s Merged', chalk_1.default.yellow.bold('OPTION SET MERGE'));
30
+ this.log(`${chalk_1.default.yellow.bold('OPTION SET MERGE')} Merged`);
31
31
  }
32
32
  catch (e) {
33
- this.log(`%s Merge Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
33
+ this.log(`${chalk_1.default.red.bold('FAIL')} Merge Failed. ${e}`);
34
34
  return;
35
35
  }
36
- this.log('%s Merge Complete.', chalk_1.default.green.bold('COMPLETE'));
36
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Merge Complete.`);
37
37
  }
38
38
  }
39
39
  exports.default = MergeOptionSets;
@@ -29,19 +29,19 @@ class MergeTypeProperties extends basecommand_1.BaseCommand {
29
29
  };
30
30
  async run() {
31
31
  try {
32
- this.log('%s Importing local file', chalk_1.default.yellow.bold('TYPE PROPERTIES MERGE'));
32
+ this.log(`${chalk_1.default.yellow.bold('TYPE PROPERTIES MERGE')} Importing local file`);
33
33
  this.log('Using File: ', this.args.file);
34
34
  logger_1.default.info(`argv: ${JSON.stringify(this.argv)}`);
35
35
  const typePaths = this.argv.slice(1);
36
36
  this.log('Using TypePaths: ', typePaths);
37
37
  await mergeTypeProperties(this.args.file, typePaths);
38
- this.log('%s Merged', chalk_1.default.yellow.bold('TYPE PROPERTIES MERGE'));
38
+ this.log(`${chalk_1.default.yellow.bold('TYPE PROPERTIES MERGE')} Merged`);
39
39
  }
40
40
  catch (e) {
41
- this.log(`%s Merge Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
41
+ this.log(`${chalk_1.default.red.bold('FAIL')} Merge Failed. ${e}`);
42
42
  return;
43
43
  }
44
- this.log('%s Merge Complete.', chalk_1.default.green.bold('COMPLETE'));
44
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Merge Complete.`);
45
45
  }
46
46
  }
47
47
  exports.default = MergeTypeProperties;
@@ -33,13 +33,13 @@ exports.default = ParseOptionSetsHierarchyValuesToKeysLocalFile;
33
33
  async function parseOptionSetsHierarchyValuesToKeysLocalFile(fileLocation) {
34
34
  try {
35
35
  await (0, login_1.authUser)();
36
- logger_1.default.info('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET HIERARCHY PARSE'));
36
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET HIERARCHY PARSE')} Importing local file`);
37
37
  logger_1.default.info('Using File: ', fileLocation);
38
38
  const { keysInOrder, uploadedOptionHierarchyData } = await parseOptionSetHierarchiesLocalFile(fileLocation);
39
39
  const parser = new json2csv_1.Parser(keysInOrder);
40
40
  const csv = parser.parse(uploadedOptionHierarchyData);
41
41
  saveData(csv);
42
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('OPTION SET HIERARCHY PARSE'));
42
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET HIERARCHY PARSE')} Parsed`);
43
43
  }
44
44
  catch (e) {
45
45
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} PARSE Failed . ${e}`);
@@ -50,17 +50,17 @@ Countries, co_egypt, Egypt
50
50
  };
51
51
  async run() {
52
52
  try {
53
- this.log('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET PARSE'));
53
+ this.log(`${chalk_1.default.yellow.bold('OPTION SET PARSE')} Importing local file`);
54
54
  this.log('Using File: ', this.args.file);
55
55
  await parseOptionSetsLocalFiles(this.args.file, this.flags.csvStyle);
56
- this.log('%s Parsed', chalk_1.default.yellow.bold('OPTION SET PARSE'));
56
+ this.log(`${chalk_1.default.yellow.bold('OPTION SET PARSE')} Parsed`);
57
57
  }
58
58
  catch (e) {
59
- this.log(`%s PARSE Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
59
+ this.log(`${chalk_1.default.red.bold('FAIL')} PARSE Failed . ${e}`);
60
60
  console.error(e);
61
61
  return;
62
62
  }
63
- this.log('%s PARSE Complete.', chalk_1.default.green.bold('COMPLETE'));
63
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} PARSE Complete.`);
64
64
  }
65
65
  }
66
66
  exports.default = ParseOptionSetsLocalFiles;
@@ -69,11 +69,11 @@ async function ParseOptionSetsToFolderStructure(args) {
69
69
  if (args?.length < 4) {
70
70
  throw new Error('File name must be included.');
71
71
  }
72
- logger_1.default.info('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET PARSE'));
72
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET PARSE')} Importing local file`);
73
73
  const fileLocation = this.args.file;
74
74
  logger_1.default.info('Using File: ', fileLocation);
75
75
  await parseOptionSetsToFolderStructure(fileLocation);
76
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('OPTION SET PARSE'));
76
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET PARSE')} Parsed`);
77
77
  }
78
78
  catch (e) {
79
79
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} PARSE Failed . ${e}`);
@@ -20,10 +20,10 @@ class ParseOptionSetsToFolderStructure extends basecommand_1.BaseCommand {
20
20
  };
21
21
  async run() {
22
22
  try {
23
- logger_1.default.info('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET PARSE'));
23
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET PARSE')} Importing local file`);
24
24
  logger_1.default.info('Using File: ', this.args.file);
25
25
  await parseOptionSetsToFolderStructure(this.args.file);
26
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('OPTION SET PARSE'));
26
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET PARSE')} Parsed`);
27
27
  }
28
28
  catch (e) {
29
29
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} PARSE Failed . ${e}`);
@@ -25,11 +25,11 @@ class ParseTypesFromFiles extends basecommand_1.BaseCommand {
25
25
  };
26
26
  async run() {
27
27
  try {
28
- logger_1.default.info('%s Parsing', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
28
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsing`);
29
29
  const fileIds = this.argv;
30
30
  logger_1.default.info('Using FileId(s): ', fileIds);
31
31
  await (0, type_parser_1.parseTypesFromFiles)(fileIds);
32
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
32
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsed`);
33
33
  }
34
34
  catch (e) {
35
35
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Parsing Failed . ${e}`);
@@ -22,11 +22,11 @@ class ParseTypesFromLocalFiles extends basecommand_1.BaseCommand {
22
22
  };
23
23
  async run() {
24
24
  try {
25
- logger_1.default.info('%s Parsing', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
25
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsing`);
26
26
  const fileLocations = this.argv;
27
27
  logger_1.default.info('Using File Location(s): ', fileLocations);
28
28
  await (0, type_parser_1.parseTypesFromLocalFiles)(fileLocations);
29
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
29
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsed`);
30
30
  }
31
31
  catch (e) {
32
32
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Parsing Failed . ${e}`);
@@ -22,13 +22,13 @@ class ParseTypesFromTemplateAndDataFromLocalFiles extends basecommand_1.BaseComm
22
22
  };
23
23
  async run() {
24
24
  try {
25
- logger_1.default.info('%s Parsing', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
25
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsing`);
26
26
  const templateFileLocation = this.args.templateFile;
27
27
  const dataFileLocations = this.argv.slice(1);
28
28
  logger_1.default.info('Using Template File Location: ', templateFileLocation);
29
29
  logger_1.default.info('Using Data File Location: ', dataFileLocations);
30
30
  await (0, type_parser_1.parseTypesFromTemplateAndDataFromLocalFiles)(templateFileLocation, dataFileLocations);
31
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
31
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsed`);
32
32
  }
33
33
  catch (e) {
34
34
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Parsing Failed . ${e}`);
@@ -21,13 +21,13 @@ class ParseTypesFromTemplateFromLocalFiles extends basecommand_1.BaseCommand {
21
21
  };
22
22
  async run() {
23
23
  try {
24
- logger_1.default.info('%s Parsing', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
24
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsing`);
25
25
  const templateFileLocation = this.args.templateFile;
26
26
  const dataFileLocation = this.args.filePath;
27
27
  logger_1.default.info('Using Template File Location: ', templateFileLocation);
28
28
  logger_1.default.info('Using Data File Location: ', dataFileLocation);
29
29
  await (0, type_parser_1.parseTypesFromTemplateFromLocalFiles)(templateFileLocation, dataFileLocation);
30
- logger_1.default.info('%s Parsed', chalk_1.default.yellow.bold('TYPES AND OPTION SETS'));
30
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES AND OPTION SETS')} Parsed`);
31
31
  }
32
32
  catch (e) {
33
33
  logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Parsing Failed . ${e}`);
@@ -35,7 +35,7 @@ exports.default = UploadOptionSetsHierarchyLocalFile;
35
35
  async function uploadOptionSetsHierarchyLocalFile(fileLocation, name) {
36
36
  try {
37
37
  await (0, login_1.authUser)();
38
- logger_1.default.info('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET HIERARCHY UPLOAD'));
38
+ logger_1.default.info(`${chalk_1.default.yellow.bold('OPTION SET HIERARCHY UPLOAD')} Importing local file`);
39
39
  logger_1.default.info('Using File: ', fileLocation);
40
40
  logger_1.default.info('Using Name: ', name);
41
41
  await uploadOptionSetHierarchiesLocalFile(fileLocation, name);
@@ -37,7 +37,7 @@ exports.default = UploadTypePropertyPolicies;
37
37
  async function uploadTypePropertyPolicies(dir) {
38
38
  try {
39
39
  await (0, login_1.authUser)();
40
- logger_1.default.info('%s Uploading', chalk_1.default.yellow.bold('TYPE PROPERTY POLICY'));
40
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPE PROPERTY POLICY')} Uploading`);
41
41
  const [reducedTypePropertyPolicies, reducedTypePropertyPolicyLinks] = await loadTPPolicies(dir);
42
42
  await uploadTPPolicyObjects(reducedTypePropertyPolicies);
43
43
  await uploadTypePropertyPolicyLinks(reducedTypePropertyPolicyLinks);
@@ -35,15 +35,15 @@ class ExportUsers extends basecommand_1.BaseCommand {
35
35
  async run() {
36
36
  try {
37
37
  await (0, login_1.authUser)();
38
- this.log('%s Getting Users.', chalk_1.default.blue.bold('START'));
38
+ this.log(`${chalk_1.default.blue.bold('START')} Getting Users.`);
39
39
  await exportUsers(this.flags.outFile ?? exports.DEFAULT_FILE_LOCATION, this.flags.overwrite);
40
- this.log('%s Done', chalk_1.default.yellow.bold('USERS'));
40
+ this.log(`${chalk_1.default.yellow.bold('USERS')} Done`);
41
41
  }
42
42
  catch (e) {
43
- this.log(`%s Users download Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
43
+ this.log(`${chalk_1.default.red.bold('FAIL')} Users download Failed. ${e}`);
44
44
  return;
45
45
  }
46
- this.log('%s Users download Complete.', chalk_1.default.green.bold('COMPLETE'));
46
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Users download Complete.`);
47
47
  }
48
48
  }
49
49
  exports.default = ExportUsers;
@@ -25,16 +25,16 @@ class ImportUsers extends basecommand_1.BaseCommand {
25
25
  async run() {
26
26
  try {
27
27
  await (0, login_1.authUser)();
28
- this.log('%s Uploading Users.', chalk_1.default.blue.bold('START'));
29
- this.log('%s Uploading', chalk_1.default.yellow.bold('USER'));
28
+ this.log(`${chalk_1.default.blue.bold('START')} Uploading Users.`);
29
+ this.log(`${chalk_1.default.yellow.bold('USER')} Uploading`);
30
30
  await uploadUsers(this.args.usersFile);
31
- this.log('%s Uploaded', chalk_1.default.yellow.bold('USER'));
31
+ this.log(`${chalk_1.default.yellow.bold('USER')} Uploaded`);
32
32
  }
33
33
  catch (e) {
34
- this.log(`%s User Upload Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
34
+ this.log(`${chalk_1.default.red.bold('FAIL')} User Upload Failed. ${e}`);
35
35
  return;
36
36
  }
37
- this.log('%s User Upload Complete.', chalk_1.default.green.bold('COMPLETE'));
37
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} User Upload Complete.`);
38
38
  }
39
39
  }
40
40
  exports.default = ImportUsers;
@@ -37,15 +37,15 @@ class ExportWorkflows extends basecommand_1.BaseCommand {
37
37
  async run() {
38
38
  try {
39
39
  await (0, login_1.authUser)();
40
- this.log('%s Getting Workflows.', chalk_1.default.blue.bold('START'));
40
+ this.log(`${chalk_1.default.blue.bold('START')} Getting Workflows.`);
41
41
  await exportWorkflows(this.flags.outFile ?? exports.DEFAULT_FILE_LOCATION, this.flags.overwrite);
42
- this.log('%s Done', chalk_1.default.yellow.bold('WORKFLOWS'));
42
+ this.log(`${chalk_1.default.yellow.bold('WORKFLOWS')} Done`);
43
43
  }
44
44
  catch (e) {
45
- this.log(`%s Workflows download Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
45
+ this.log(`${chalk_1.default.red.bold('FAIL')} Workflows download Failed. ${e}`);
46
46
  return;
47
47
  }
48
- this.log('%s Workflows download Complete.', chalk_1.default.green.bold('COMPLETE'));
48
+ this.log(`${chalk_1.default.green.bold('COMPLETE')} Workflows download Complete.`);
49
49
  }
50
50
  }
51
51
  exports.default = ExportWorkflows;
@@ -1,5 +1,7 @@
1
1
  import { App } from '@contrail/entity-types';
2
2
  import { AppDeclaration, AppExtensionPackage } from '../../interfaces';
3
- export declare function createExtensionPackage(appId: string, extensionDir: string): Promise<any>;
3
+ export declare function createExtensionPackage(appId: string, extensionDir: string, options: {
4
+ debug: boolean;
5
+ }): Promise<any>;
4
6
  export declare function getExistingApp(appDeclaration: AppDeclaration): Promise<App>;
5
7
  export declare function getExtensionPackage(packageId: string): Promise<AppExtensionPackage>;
@@ -32,27 +32,12 @@ function cleanAndPrepareTmpDir(extensionDir, tmpDir) {
32
32
  function cleanUp(tmpDir) {
33
33
  fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
34
34
  }
35
- function installDependencies(tmpDir) {
36
- try {
37
- logger_1.default.info('Installing production dependencies started...');
38
- const child_process = require('child_process');
39
- child_process.execSync('npm install --omit=dev --prefix ./', {
40
- cwd: tmpDir,
41
- stdio: 'inherit',
42
- });
43
- logger_1.default.info('Installing production dependencies done.');
44
- }
45
- catch (e) {
46
- logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Failed during dependency install: ${e}`);
47
- throw e;
48
- }
49
- }
50
35
  function buildExtension(packageId, extensionDir, tmpDir) {
51
36
  try {
52
37
  logger_1.default.info('Building package...');
53
38
  const child_process = require('child_process');
54
39
  console.log('Building package... in ', tmpDir);
55
- child_process.execSync(`npx ng build --output-path ${tmpDir}/dist --deploy-url /packages/${packageId}/`, {
40
+ child_process.execSync(`npx ng build --output-path "${tmpDir}/dist" --deploy-url /packages/${packageId}/`, {
56
41
  cwd: extensionDir,
57
42
  stdio: 'inherit',
58
43
  });
@@ -71,7 +56,7 @@ function copyAssets(extensionDir, tmpDir) {
71
56
  try {
72
57
  logger_1.default.info('Copying Assets...');
73
58
  const child_process = require('child_process');
74
- child_process.execSync(`npx copyfiles assets/**/* ${tmpDir}/dist/`, {
59
+ child_process.execSync(`npx copyfiles assets/**/* "${tmpDir}/dist/"`, {
75
60
  cwd: extensionDir,
76
61
  stdio: 'inherit',
77
62
  });
@@ -113,9 +98,9 @@ async function uploadExtensionPackage(appExtensionPackage, tmpDir) {
113
98
  logger_1.default.info(`${chalk_1.default.green.bold('EXTENSION')} Extension package uploaded. ID: ${appExtensionPackage.id}`);
114
99
  return appExtensionPackage;
115
100
  }
116
- async function createExtensionPackage(appId, extensionDir) {
101
+ async function createExtensionPackage(appId, extensionDir, options) {
117
102
  const tmpDir = createTmpDir(extensionDir);
118
- logger_1.default.info(`%s Creating extension package at ${tmpDir}`, chalk_1.default.blue.bold('START'));
103
+ logger_1.default.info(`${chalk_1.default.blue.bold('START')} Creating extension package at ${tmpDir}`);
119
104
  cleanAndPrepareTmpDir(extensionDir, tmpDir);
120
105
  installDependenciesInExtensionDirectory(extensionDir);
121
106
  installDependenciesInTmpDir(tmpDir);
@@ -128,7 +113,12 @@ async function createExtensionPackage(appId, extensionDir) {
128
113
  await zipDist(tmpDir);
129
114
  await uploadExtensionPackage(appExtensionPackage, tmpDir);
130
115
  logger_1.default.info(`${chalk_1.default.green.bold('COMPLETE')} Extension packaged and uploaded.`);
131
- cleanUp(tmpDir);
116
+ if (options.debug) {
117
+ logger_1.default.debug("debug mode enabled. Not cleaning up tmp dir.");
118
+ }
119
+ else {
120
+ cleanUp(tmpDir);
121
+ }
132
122
  return appExtensionPackage;
133
123
  }
134
124
  exports.createExtensionPackage = createExtensionPackage;
@@ -21,7 +21,7 @@ class ExtensionsDeployer {
21
21
  return;
22
22
  }
23
23
  // UPSERT / DELETE BASED ON EXTENSION IDENTIFIER
24
- logger_1.default.info('%s \tDeploying extensions.', chalk_1.default.yellow.bold('EXTENSION'));
24
+ logger_1.default.info(`${chalk_1.default.yellow.bold('EXTENSION')} Deploying extensions.`);
25
25
  const existingExtensions = await getExtensionDefinitionsForAppVersion(app);
26
26
  logger_1.default.debug(appDeclaration.extensions);
27
27
  if (appDeclaration.extensions) {
@@ -19,7 +19,7 @@ class LocalWorkflowTemplateDeployer {
19
19
  // FETCH ALL WORKFLOWS FROM THE API.
20
20
  const existingWorkflows = await (0, event_workflow_templates_1.getExistingWorkflowTemplates)();
21
21
  // UPSERT / DELETE BASED ON WORKFLOW TEMPLATES IDENTIFIER
22
- logger_1.default.info('%s \tDeploying workflow templates.', chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
22
+ logger_1.default.info(`${chalk_1.default.yellow.bold('WORKFLOW TEMPLATES')} Deploying workflow templates.`);
23
23
  logger_1.default.info(wtDeclaration);
24
24
  for (const workflowKey of Object.keys(wtDeclaration.workflows)) {
25
25
  await this.deployWorkflowTemplate(wtDeclaration.workflows[workflowKey], existingWorkflows, wtDeclaration.appIdentifier);
@@ -50,7 +50,7 @@ class LocalWorkflowTemplateDeployer {
50
50
  if (workflowTemplate.crons) {
51
51
  await this.createWorkflowSchedule(workflowTemplate, newWorkflowTemplate.id);
52
52
  }
53
- logger_1.default.info(`%s Created new workflow definition: ${workflowKey}`, chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
53
+ logger_1.default.info(`${chalk_1.default.yellow.bold('WORKFLOW TEMPLATES')} Creating new workflow template: ${workflowKey}`);
54
54
  return newWorkflowTemplate;
55
55
  }
56
56
  async populateActionIds(workflowTemplate, workflowKey, appIdentifier) {
@@ -115,7 +115,7 @@ class LocalWorkflowTemplateDeployer {
115
115
  const cronsToRemove = existingSchedules.filter((x) => !newCronNames.includes(x.name));
116
116
  const cronsToEdit = existingSchedules.filter((x) => newCronNames.includes(x.name));
117
117
  for (const cron of cronsToAdd) {
118
- logger_1.default.info(`%s Adding new schedule: ${cron.name}`, chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
118
+ logger_1.default.info(`${chalk_1.default.yellow.bold('WORKFLOW TEMPLATES')} Adding new schedule: ${cron.name}`);
119
119
  await (0, schedules_1.createSchedule)({
120
120
  cron: cron.cron,
121
121
  entityReference: `event-workflow-template:${workflowId}`,
@@ -130,11 +130,11 @@ class LocalWorkflowTemplateDeployer {
130
130
  });
131
131
  }
132
132
  for (const cron of cronsToRemove) {
133
- logger_1.default.info(`%s Removing schedule: ${cron.name}`, chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
133
+ logger_1.default.info(`${chalk_1.default.yellow.bold('WORKFLOW TEMPLATES')} Removing schedule: ${cron.name}`);
134
134
  await (0, schedules_1.deleteSchedule)(cron.id);
135
135
  }
136
136
  for (const cron of cronsToEdit) {
137
- logger_1.default.info(`%s Updating schedule: ${cron.name}`, chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
137
+ logger_1.default.info(`${chalk_1.default.yellow.bold('WORKFLOW TEMPLATES')} Updating schedule: ${cron.name}`);
138
138
  const newCron = workflowTemplate.crons.find((x) => x.name === cron.name);
139
139
  await (0, schedules_1.updateSchedule)({
140
140
  id: cron.id,
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.1.3",
2
+ "version": "3.1.6",
3
3
  "commands": {
4
4
  "app:create": {
5
5
  "id": "app:create",
@@ -3056,6 +3056,13 @@
3056
3056
  "description": "The extension identifier to deploy. The identifier of the extension is the \"identifier\" property in the extension defined in the app.yml",
3057
3057
  "required": true,
3058
3058
  "multiple": false
3059
+ },
3060
+ "debug": {
3061
+ "name": "debug",
3062
+ "type": "boolean",
3063
+ "char": "d",
3064
+ "description": "Enable debug mode",
3065
+ "allowNo": false
3059
3066
  }
3060
3067
  },
3061
3068
  "args": {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contrail/cli",
3
- "version": "3.1.3",
3
+ "version": "3.1.6",
4
4
  "description": "VibeIQ's Contrail Platform CLI.",
5
5
  "bin": {
6
6
  "contrail-cli": "./bin/run",