@contrail/cli 2.1.28 → 2.2.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.
Files changed (65) hide show
  1. package/README.md +86 -2
  2. package/dist/commands/app/create.js +3 -4
  3. package/dist/commands/app/delete.js +5 -5
  4. package/dist/commands/app/init.d.ts +6 -0
  5. package/dist/commands/app/init.js +63 -0
  6. package/dist/commands/app/publish.js +3 -3
  7. package/dist/commands/app/version/major.d.ts +7 -0
  8. package/dist/commands/app/version/major.js +40 -0
  9. package/dist/commands/app/version/minor.d.ts +7 -0
  10. package/dist/commands/app/version/minor.js +40 -0
  11. package/dist/commands/app/version/patch.d.ts +7 -0
  12. package/dist/commands/app/version/patch.js +40 -0
  13. package/dist/commands/colors/deleteAll.js +3 -3
  14. package/dist/commands/colors/load.js +5 -5
  15. package/dist/commands/config/environments/remove.js +2 -2
  16. package/dist/commands/config/environments/set.js +1 -1
  17. package/dist/commands/groups/export.js +1 -1
  18. package/dist/commands/loader-process/load.js +4 -4
  19. package/dist/commands/loader-process/upload-and-load.js +4 -4
  20. package/dist/commands/projects/load.js +2 -2
  21. package/dist/commands/types/exportOptionSetHierarchies.js +4 -4
  22. package/dist/commands/types/getAll.js +31 -25
  23. package/dist/commands/types/loadAll.js +2 -2
  24. package/dist/commands/types/mergeOptionSets.js +5 -4
  25. package/dist/commands/types/mergeTypeProperties.js +2 -2
  26. package/dist/commands/types/parseOptionSetsHierarchyLocalFile.js +4 -4
  27. package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.js +2 -2
  28. package/dist/commands/types/parseOptionSetsLocalFiles.js +2 -2
  29. package/dist/commands/types/parseOptionSetsToFolderStructure.js +2 -2
  30. package/dist/commands/types/parseTypesFromFiles.js +2 -2
  31. package/dist/commands/types/parseTypesFromLocalFiles.js +2 -2
  32. package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.js +2 -2
  33. package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.js +2 -2
  34. package/dist/commands/types/uploadOptionSetHierarchies.js +30 -20
  35. package/dist/commands/types/uploadOptionSets.js +16 -15
  36. package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.js +5 -5
  37. package/dist/commands/types/uploadRuleSets.js +20 -22
  38. package/dist/commands/types/uploadTypePolicies.js +23 -23
  39. package/dist/commands/types/uploadTypePropertyPolicies.js +14 -14
  40. package/dist/commands/types/uploadUsageInfo.js +12 -12
  41. package/dist/commands/webhooks/create.js +2 -4
  42. package/dist/commands/webhooks/list.js +3 -5
  43. package/dist/helpers/app/actions-deployer.js +4 -4
  44. package/dist/helpers/app/app-deployer.js +11 -9
  45. package/dist/helpers/app/extensions-deployer.js +4 -4
  46. package/dist/helpers/app/update-app-config.d.ts +2 -0
  47. package/dist/helpers/app/update-app-config.js +20 -0
  48. package/dist/helpers/app/upgrade-version.d.ts +16 -0
  49. package/dist/helpers/app/upgrade-version.js +37 -0
  50. package/dist/helpers/app/upgrade-version.spec.d.ts +1 -0
  51. package/dist/helpers/app/upgrade-version.spec.js +33 -0
  52. package/dist/helpers/colors/helpers.js +2 -2
  53. package/dist/helpers/loader-process/helpers.js +4 -4
  54. package/dist/helpers/projects/helpers.js +1 -1
  55. package/dist/helpers/types/csv-parser.js +6 -6
  56. package/dist/helpers/types/type-extractor.js +1 -1
  57. package/dist/helpers/types/type-parser.js +11 -11
  58. package/dist/helpers/types/type-uploader.js +21 -21
  59. package/dist/helpers/workflow-template-definitions/workflow-template-definition-deployer.js +6 -6
  60. package/dist/helpers/workflow-templates/helper.js +7 -7
  61. package/dist/interfaces.d.ts +2 -1
  62. package/dist/templates/typescript/app.yml +1 -1
  63. package/dist/templates/typescript/package.json +2 -2
  64. package/oclif.manifest.json +150 -2
  65. package/package.json +3 -2
@@ -18,7 +18,7 @@ class ExtensionsDeployer {
18
18
  var _a;
19
19
  // FETCH ALL EXTENSIONS FROM THE API.
20
20
  if (!appDeclaration.extensions) {
21
- logger_1.default.info('%s \tNo extensions found...skipping.', chalk_1.default.yellow.bold('EXTENSION'));
21
+ logger_1.default.info(`${chalk_1.default.yellow.bold('EXTENSION')} \tNo extensions found...skipping.`);
22
22
  return;
23
23
  }
24
24
  // UPSERT / DELETE BASED ON EXTENSION IDENTIFIER
@@ -32,7 +32,7 @@ class ExtensionsDeployer {
32
32
  }
33
33
  }
34
34
  async deployExtension(extension, app, existingExtensions) {
35
- logger_1.default.info(`%s \tDeploying extension: ${extension === null || extension === void 0 ? void 0 : extension.identifier}`, chalk_1.default.yellow.bold('EXTENSION'));
35
+ logger_1.default.info(`${chalk_1.default.yellow.bold('EXTENSION')} \tDeploying extension: ${extension === null || extension === void 0 ? void 0 : extension.identifier}`);
36
36
  const identifier = util_1.AppUtil.createExtensionIdentifier({
37
37
  appIdentifier: app.identifier,
38
38
  extensionIdentifier: extension.identifier,
@@ -63,7 +63,7 @@ class ExtensionsDeployer {
63
63
  entityName: 'app-extension-definition',
64
64
  object: newObject,
65
65
  });
66
- logger_1.default.info(`%s Created new extension definition: ${extension === null || extension === void 0 ? void 0 : extension.identifier}`, chalk_1.default.yellow.bold('APP'));
66
+ logger_1.default.info(`${chalk_1.default.yellow.bold('EXTENSION')} Created new extension definition: ${extension === null || extension === void 0 ? void 0 : extension.identifier}`);
67
67
  return actionDefinition;
68
68
  }
69
69
  async updateActionDefinition(existingActionDefinition, extension, app) {
@@ -85,7 +85,7 @@ class ExtensionsDeployer {
85
85
  id: existingActionDefinition.id,
86
86
  object: updates,
87
87
  });
88
- logger_1.default.info(`%s Updated existing extension definition: ${extensionDefinition.identifier}`, chalk_1.default.yellow.bold('APP'));
88
+ logger_1.default.info(`${chalk_1.default.yellow.bold('EXTENSION')} Updated existing extension definition: ${extensionDefinition.identifier}`);
89
89
  return extensionDefinition;
90
90
  }
91
91
  }
@@ -0,0 +1,2 @@
1
+ import { AppDeclaration } from '../../interfaces';
2
+ export declare function updateAppConfig(newAppYml: AppDeclaration): void;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateAppConfig = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path = tslib_1.__importStar(require("path"));
6
+ const fs_1 = tslib_1.__importDefault(require("fs"));
7
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
8
+ function updateAppConfig(newAppYml) {
9
+ const TARGET_DIR = process.cwd();
10
+ try {
11
+ // Convert the updated data back to YAML format
12
+ const updatedYamlData = js_yaml_1.default.dump(newAppYml);
13
+ // Write the updated YAML back to the file
14
+ fs_1.default.writeFileSync(path.resolve(path.join(TARGET_DIR, 'app.yml')), updatedYamlData, 'utf8');
15
+ }
16
+ catch (e) {
17
+ throw new Error(`ERROR PARSING YAML: ${e}`);
18
+ }
19
+ }
20
+ exports.updateAppConfig = updateAppConfig;
@@ -0,0 +1,16 @@
1
+ import semver from 'semver';
2
+ /**
3
+ * Upgrades a semantic version based on a specified release type.
4
+ *
5
+ * @param {string} currentVersion - The current semantic version string.
6
+ * @param {semver.ReleaseType} type - The type of release ('major', 'minor', 'patch').
7
+ * @returns {string} The upgraded semantic version.
8
+ * @throws {Error} If the provided currentVersion is not a valid semantic version.
9
+ *
10
+ * @example
11
+ * const currentVersion = '1.2.3';
12
+ * const releaseType = 'minor';
13
+ * const upgradedVersion = upgradeVersion(currentVersion, releaseType);
14
+ * console.log(upgradedVersion); // Outputs: '1.3.0'
15
+ */
16
+ export declare function upgradeVersion(currentVersion: string, type: semver.ReleaseType): string;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.upgradeVersion = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const semver_1 = tslib_1.__importDefault(require("semver"));
6
+ /**
7
+ * Upgrades a semantic version based on a specified release type.
8
+ *
9
+ * @param {string} currentVersion - The current semantic version string.
10
+ * @param {semver.ReleaseType} type - The type of release ('major', 'minor', 'patch').
11
+ * @returns {string} The upgraded semantic version.
12
+ * @throws {Error} If the provided currentVersion is not a valid semantic version.
13
+ *
14
+ * @example
15
+ * const currentVersion = '1.2.3';
16
+ * const releaseType = 'minor';
17
+ * const upgradedVersion = upgradeVersion(currentVersion, releaseType);
18
+ * console.log(upgradedVersion); // Outputs: '1.3.0'
19
+ */
20
+ function upgradeVersion(currentVersion, type) {
21
+ try {
22
+ const paddedVersion = currentVersion
23
+ .toString()
24
+ .split('.')
25
+ .concat(new Array(3).fill(0).map(String))
26
+ .slice(0, 3)
27
+ .join('.');
28
+ if (!semver_1.default.valid(paddedVersion)) {
29
+ throw new Error('Invalid version string');
30
+ }
31
+ return semver_1.default.inc(paddedVersion, type);
32
+ }
33
+ catch (e) {
34
+ throw new Error(`ERROR PARSING YAML: ${e}`);
35
+ }
36
+ }
37
+ exports.upgradeVersion = upgradeVersion;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const semver_1 = tslib_1.__importDefault(require("semver"));
5
+ const upgrade_version_1 = require("./upgrade-version");
6
+ describe('upgradeVersion', () => {
7
+ it('should upgrade the major semantic version correctly for a valid input', () => {
8
+ const currentVersion = '1.1.1';
9
+ const releaseType = 'major';
10
+ const upgradedVersion = (0, upgrade_version_1.upgradeVersion)(currentVersion, releaseType);
11
+ const expectedVersion = semver_1.default.inc(currentVersion, releaseType);
12
+ expect(upgradedVersion).toBe(expectedVersion);
13
+ });
14
+ it('should upgrade the minor semantic version correctly for a valid input', () => {
15
+ const currentVersion = '1.2.3';
16
+ const releaseType = 'minor';
17
+ const upgradedVersion = (0, upgrade_version_1.upgradeVersion)(currentVersion, releaseType);
18
+ const expectedVersion = semver_1.default.inc(currentVersion, releaseType);
19
+ expect(upgradedVersion).toBe(expectedVersion);
20
+ });
21
+ it('should upgrade the patch semantic version correctly for a valid input', () => {
22
+ const currentVersion = '1.1.0';
23
+ const releaseType = 'patch';
24
+ const upgradedVersion = (0, upgrade_version_1.upgradeVersion)(currentVersion, releaseType);
25
+ const expectedVersion = semver_1.default.inc(currentVersion, releaseType);
26
+ expect(upgradedVersion).toBe(expectedVersion);
27
+ });
28
+ it('should throw an error for an invalid semantic version input', () => {
29
+ const currentVersion = 'invalidVersion';
30
+ const releaseType = 'patch';
31
+ expect(() => (0, upgrade_version_1.upgradeVersion)(currentVersion, releaseType)).toThrowError('Invalid version string');
32
+ });
33
+ });
@@ -21,7 +21,7 @@ async function getLocalColors() {
21
21
  }
22
22
  exports.getLocalColors = getLocalColors;
23
23
  async function getExistingColors() {
24
- logger_1.default.info('%s Getting Existing Colors', chalk_1.default.yellow.bold('COLORS'));
24
+ logger_1.default.info(`${chalk_1.default.yellow.bold('COLORS')} Getting Existing Colors`);
25
25
  const colors = [];
26
26
  try {
27
27
  let nextPageKey = null;
@@ -56,7 +56,7 @@ async function uploadColors() {
56
56
  const existingNamesValues = existingColors.filter((x) => x.name).map((x) => x.name);
57
57
  for (const color of colors) {
58
58
  if (existingNamesValues.includes(color.name)) {
59
- logger_1.default.info('%s SKIPPING %s (%s)', chalk_1.default.yellow.bold('COLORS'), color.hex, color.name);
59
+ logger_1.default.info(`${chalk_1.default.yellow.bold('COLORS')} SKIPPING ${color.hex} (${color.name})`);
60
60
  continue;
61
61
  }
62
62
  if (color.hex.length > 1 && color.hex[0] === '#') {
@@ -27,7 +27,7 @@ function getLocalUploadConfig(configFileName) {
27
27
  }
28
28
  const CURRENT_DIR = process.cwd();
29
29
  const fullPath = path.join(CURRENT_DIR, configFileName);
30
- logger_1.default.info('Getting config from path: ', fullPath);
30
+ logger_1.default.info(`Getting config from path: ${fullPath}`);
31
31
  if (ext === '.yml') {
32
32
  try {
33
33
  const doc = js_yaml_1.default.load(fs.readFileSync(fullPath, 'utf8'));
@@ -53,7 +53,7 @@ async function uploadFile(incomingFileName) {
53
53
  entityName: 'file',
54
54
  object: { contentType: 'text/csv', fileName: fileName, ttl: 24 * 60 * 60 * 1000 },
55
55
  });
56
- logger_1.default.info('VibeIQ file ID:', file.id);
56
+ logger_1.default.info(`VibeIQ file ID: ${file.id}`);
57
57
  // Upload the CSV data to the newly created VibeIQ file
58
58
  const fileDetails = {
59
59
  contentType: 'text/csv',
@@ -65,14 +65,14 @@ async function uploadFile(incomingFileName) {
65
65
  async function loadFile(config) {
66
66
  const entities = new sdk_1.Entities();
67
67
  // start a load job referencing the newly created file
68
- logger_1.default.info('Loading with config: ', config);
68
+ logger_1.default.info(`Loading with config: ${config}`);
69
69
  const loadJob = await entities.create({
70
70
  entityName: 'loader-process',
71
71
  object: {
72
72
  ...config,
73
73
  },
74
74
  });
75
- logger_1.default.info('Load has been kicked off. loader-process ID: ', loadJob.id);
75
+ logger_1.default.info(`Load has been kicked off. loader-process ID: ${loadJob.id}`);
76
76
  }
77
77
  async function uploadAndLoadLocalFile(incomingFileName, configFileName) {
78
78
  const file = await uploadFile(incomingFileName);
@@ -12,7 +12,7 @@ function getProjectFile(fileName) {
12
12
  const CURRENT_DIR = process.cwd();
13
13
  try {
14
14
  const fullPath = path.join(CURRENT_DIR, fileName);
15
- logger_1.default.info('Getting file from path: ', fullPath);
15
+ logger_1.default.info(`Getting file from path: ${fullPath}`);
16
16
  const doc = js_yaml_1.default.load(fs_1.default.readFileSync(fullPath, 'utf8'));
17
17
  return doc.projectConfiguration;
18
18
  }
@@ -10,7 +10,7 @@ async function getCSVFromFile(loadFileId) {
10
10
  let file;
11
11
  try {
12
12
  file = await new sdk_1.Entities().get({ entityName: 'file', id: loadFileId });
13
- logger_1.default.info('Got file: ', file);
13
+ logger_1.default.info(`Got file: ${file}`);
14
14
  }
15
15
  catch (e) {
16
16
  logger_1.default.info(`Failed to get file: ${loadFileId}`, JSON.stringify(e));
@@ -26,15 +26,15 @@ async function getCSVFromFile(loadFileId) {
26
26
  response = await new Promise((resolve, reject) => {
27
27
  client
28
28
  .get(file.downloadUrl, function (res) {
29
- logger_1.default.info('Status code:', res.statusCode);
30
- logger_1.default.info('Status text:', res.statusMessage);
29
+ logger_1.default.info(`Status code: ${res.statusCode}`);
30
+ logger_1.default.info(`Status text: ${res.statusMessage}`);
31
31
  let body = '';
32
32
  res.on('data', (data) => {
33
33
  body += data.toString();
34
34
  });
35
35
  res.on('end', () => {
36
- logger_1.default.info('Response body:');
37
- //logger.info(body);
36
+ logger_1.default.debug('Response body:');
37
+ logger_1.default.debug(body);
38
38
  resolve(body);
39
39
  });
40
40
  })
@@ -45,7 +45,7 @@ async function getCSVFromFile(loadFileId) {
45
45
  });
46
46
  }
47
47
  catch (e) {
48
- logger_1.default.info(`Failed to get data from downloadUrl: ${file.downloadUrl}`, e);
48
+ logger_1.default.info(`Failed to get data from downloadUrl: ${file.downloadUrl} ${JSON.stringify(e)}`);
49
49
  throw e;
50
50
  }
51
51
  if (!response) {
@@ -8,7 +8,7 @@ const p_limit_1 = tslib_1.__importDefault(require("p-limit"));
8
8
  const logger_1 = tslib_1.__importDefault(require("../../logger"));
9
9
  const limit = (0, p_limit_1.default)(30);
10
10
  async function getTypes(withTypeProperties = true) {
11
- logger_1.default.info('%s Retrieving', chalk_1.default.yellow.bold('TYPES'));
11
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES')} Retrieving`);
12
12
  const entitiesClient = new sdk_1.Entities();
13
13
  const types = await entitiesClient.get({
14
14
  entityName: 'type',
@@ -25,13 +25,13 @@ async function parseTypesFromLocalFiles(fileLocations) {
25
25
  const csvJSONData = [];
26
26
  for (const fileLocation of fileLocations) {
27
27
  try {
28
- logger_1.default.info('Getting data for fileLocation: ', fileLocation);
28
+ logger_1.default.info(`Getting data for fileLocation: ${fileLocation}`);
29
29
  const csvData = await loadDataFromLocalCSV(fileLocation);
30
30
  logger_1.default.info(`CSV import was successful. ${csvData === null || csvData === void 0 ? void 0 : csvData.length} rows found. Adding to total rows.`);
31
31
  csvJSONData.push(...csvData);
32
32
  }
33
33
  catch (e) {
34
- logger_1.default.info('Error importing csv data.', e);
34
+ logger_1.default.info(`Error importing csv data. ${e}`);
35
35
  throw e;
36
36
  }
37
37
  }
@@ -45,15 +45,15 @@ async function parseTypesFromTemplateFromLocalFiles(templateFileLocation, dataFi
45
45
  let templateCSVData = [];
46
46
  let dataCSVData = [];
47
47
  try {
48
- logger_1.default.info('Getting template from fileLocation: ', templateFileLocation);
48
+ logger_1.default.info(`Getting template from fileLocation: ${templateFileLocation}`);
49
49
  templateCSVData = await loadDataFromLocalCSV(templateFileLocation);
50
50
  logger_1.default.info(`CSV import was successful. ${templateCSVData === null || templateCSVData === void 0 ? void 0 : templateCSVData.length} rows found.`);
51
- logger_1.default.info('Getting data from fileLocation: ', dataFileLocation);
51
+ logger_1.default.info(`Getting data from fileLocation: ${dataFileLocation}`);
52
52
  dataCSVData = await loadDataFromLocalCSV(dataFileLocation);
53
53
  logger_1.default.info(`CSV import was successful. ${dataCSVData === null || dataCSVData === void 0 ? void 0 : dataCSVData.length} rows found.`);
54
54
  }
55
55
  catch (e) {
56
- logger_1.default.info('Error importing csv data.', e);
56
+ logger_1.default.info(`Error importing csv data. ${e}`);
57
57
  throw e;
58
58
  }
59
59
  const types = (0, types_1.GetTypesFromTemplate)(templateCSVData, dataCSVData);
@@ -64,24 +64,24 @@ exports.parseTypesFromTemplateFromLocalFiles = parseTypesFromTemplateFromLocalFi
64
64
  async function parseTypesFromTemplateAndDataFromLocalFiles(templateFileLocation, dataFileLocations) {
65
65
  let templateCSVData = [];
66
66
  try {
67
- logger_1.default.info('Getting template from fileLocation: ', templateFileLocation);
67
+ logger_1.default.info(`Getting template from fileLocation: ${templateFileLocation}`);
68
68
  templateCSVData = await loadDataFromLocalCSV(templateFileLocation);
69
69
  logger_1.default.info(`CSV import was successful. ${templateCSVData === null || templateCSVData === void 0 ? void 0 : templateCSVData.length} rows found.`);
70
70
  }
71
71
  catch (e) {
72
- logger_1.default.info('Error importing csv data.', e);
72
+ logger_1.default.info(`Error importing csv data. ${e}`);
73
73
  throw e;
74
74
  }
75
75
  const dataCSVData = [];
76
76
  for (const dataFileLocation of dataFileLocations) {
77
77
  try {
78
- logger_1.default.info('Getting data for dataFileLocation: ', dataFileLocation);
78
+ logger_1.default.info(`Getting data for dataFileLocation: ${dataFileLocation}`);
79
79
  const csvData = await loadDataFromLocalCSV(dataFileLocation);
80
80
  logger_1.default.info(`CSV import was successful. ${csvData === null || csvData === void 0 ? void 0 : csvData.length} rows found. Adding to total rows.`);
81
81
  dataCSVData.push(...csvData);
82
82
  }
83
83
  catch (e) {
84
- logger_1.default.info('Error importing csv data.', e);
84
+ logger_1.default.info(`Error importing csv data. ${e}`);
85
85
  throw e;
86
86
  }
87
87
  }
@@ -96,13 +96,13 @@ async function parseTypesFromFiles(fileIds) {
96
96
  const csvJSONData = [];
97
97
  for (const loadFileId of fileIds) {
98
98
  try {
99
- logger_1.default.info('Getting data for fileId: ', loadFileId);
99
+ logger_1.default.info(`Getting data for fileId: ${loadFileId}`);
100
100
  const csvJSON = await (0, csv_parser_1.getCSVFromFile)(loadFileId);
101
101
  logger_1.default.info(`CSV download was successful. ${csvJSON === null || csvJSON === void 0 ? void 0 : csvJSON.length} rows found. Adding to total rows`);
102
102
  csvJSONData.push(...csvJSON);
103
103
  }
104
104
  catch (e) {
105
- logger_1.default.info('Error retrieving csv data', e);
105
+ logger_1.default.info(`Error retrieving csv data ${e}`);
106
106
  throw e;
107
107
  }
108
108
  }
@@ -13,16 +13,16 @@ const logger_1 = tslib_1.__importDefault(require("../../logger"));
13
13
  async function uploadTypes(dir) {
14
14
  try {
15
15
  const userConfig = await (0, login_1.authUser)();
16
- logger_1.default.info(`%s Getting all types for orgId: ${userConfig.orgId}`, chalk_1.default.blue.bold('START'));
17
- logger_1.default.info('%s Uploading', chalk_1.default.yellow.bold('TYPES'));
16
+ logger_1.default.info(`START Getting all types for orgId: ${userConfig.orgId}`);
17
+ logger_1.default.info('TYPES Uploading ');
18
18
  await uploadReducedTypes(dir);
19
- logger_1.default.info('%s Uploaded', chalk_1.default.yellow.bold('TYPES'));
19
+ logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES')} Uploaded`);
20
20
  }
21
21
  catch (e) {
22
- logger_1.default.info(`%s Types Upload Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
22
+ logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Types Upload Failed . ${e}`);
23
23
  return;
24
24
  }
25
- logger_1.default.info('%s Types Upload Complete.', chalk_1.default.green.bold('COMPLETE'));
25
+ logger_1.default.info(`${chalk_1.default.green.bold('COMPLETE')} Types Upload Complete.`);
26
26
  }
27
27
  exports.uploadTypes = uploadTypes;
28
28
  function loadReducedTypes(fromDir) {
@@ -66,10 +66,10 @@ async function uploadReducedTypes(dir) {
66
66
  const found = currentTypesBySlug[type.slug];
67
67
  if (!found) {
68
68
  if (!type.typePath.includes(':')) {
69
- logger_1.default.info('Cannot create a base type. Skipping: ', type.slug);
69
+ logger_1.default.info(`Cannot create a base type. Skipping: ${type.slug}`);
70
70
  continue;
71
71
  }
72
- logger_1.default.info('Creating Type: ', type.slug);
72
+ logger_1.default.info(`Creating Type: ${type.slug}`);
73
73
  const createdType = await new sdk_1.Entities().create({
74
74
  entityName: 'type',
75
75
  object: {
@@ -84,7 +84,7 @@ async function uploadReducedTypes(dir) {
84
84
  await uploadReducedTypeProperties(createdType, newTypeProperties, type.typeProperties);
85
85
  }
86
86
  else {
87
- logger_1.default.info('Updating Type: ', type.slug);
87
+ logger_1.default.info(`Updating Type: ${type.slug}`);
88
88
  const updatedType = await new sdk_1.Entities().update({
89
89
  entityName: 'type',
90
90
  id: found.id,
@@ -99,7 +99,7 @@ async function uploadReducedTypes(dir) {
99
99
  }
100
100
  }
101
101
  catch (err) {
102
- logger_1.default.info('Error Uploading Types: ', err);
102
+ logger_1.default.info(`Error Uploading Types: ${err}`);
103
103
  }
104
104
  }
105
105
  }
@@ -116,15 +116,15 @@ async function uploadReducedTypeProperties(type, currentPropertyTypes, newProper
116
116
  const optionSets = await new sdk_1.Entities().get({
117
117
  entityName: 'type-property-option-set',
118
118
  });
119
- const optionSetIdByName = {};
119
+ const optionSetIdByIdentifier = {};
120
120
  for (const optionSet of optionSets) {
121
- optionSetIdByName[optionSet.name] = optionSet.id;
121
+ optionSetIdByIdentifier[optionSet.identifier] = optionSet.id;
122
122
  }
123
123
  for (const newPropertyType of newPropertyTypes) {
124
124
  try {
125
125
  const found = currentPropertyTypeBySlug[newPropertyType.slug];
126
126
  if (!found && !newPropertyType.inherited) {
127
- logger_1.default.info('Creating Type-Property: ', newPropertyType.slug);
127
+ logger_1.default.info(`Creating Type-Property: ${newPropertyType.slug}`);
128
128
  await sdk_1.Request.request(`/types/${type.id}/type-properties`, {
129
129
  method: 'POST',
130
130
  body: JSON.stringify({
@@ -135,7 +135,7 @@ async function uploadReducedTypeProperties(type, currentPropertyTypes, newProper
135
135
  editable: newPropertyType.editable,
136
136
  searchable: newPropertyType.searchable,
137
137
  core: newPropertyType.core,
138
- typePropertyOptionSetId: optionSetIdByName[newPropertyType.typePropertyOptionSetName],
138
+ typePropertyOptionSetId: optionSetIdByIdentifier[newPropertyType.typePropertyOptionSetSlug],
139
139
  formula: newPropertyType.formula,
140
140
  referencedTypePath: newPropertyType.referencedTypePath,
141
141
  referencedTypeRootSlug: newPropertyType.referencedTypeRootSlug,
@@ -154,8 +154,8 @@ async function uploadReducedTypeProperties(type, currentPropertyTypes, newProper
154
154
  }
155
155
  else if (found &&
156
156
  !newPropertyType.inherited &&
157
- !typePropertiesEqual(found, newPropertyType, optionSetIdByName)) {
158
- logger_1.default.info('Updating Type-Property: ', newPropertyType.slug);
157
+ !typePropertiesEqual(found, newPropertyType, optionSetIdByIdentifier)) {
158
+ logger_1.default.info(`Updating Type-Property: ${newPropertyType.slug}`);
159
159
  await new sdk_1.Entities().update({
160
160
  entityName: 'type-property',
161
161
  id: found.id,
@@ -167,7 +167,7 @@ async function uploadReducedTypeProperties(type, currentPropertyTypes, newProper
167
167
  editable: (_e = newPropertyType.editable) !== null && _e !== void 0 ? _e : null,
168
168
  searchable: (_f = newPropertyType.searchable) !== null && _f !== void 0 ? _f : null,
169
169
  core: (_g = newPropertyType.core) !== null && _g !== void 0 ? _g : null,
170
- typePropertyOptionSetId: (_h = optionSetIdByName[newPropertyType.typePropertyOptionSetName]) !== null && _h !== void 0 ? _h : null,
170
+ typePropertyOptionSetId: (_h = optionSetIdByIdentifier[newPropertyType.typePropertyOptionSetSlug]) !== null && _h !== void 0 ? _h : null,
171
171
  formula: (_j = newPropertyType.formula) !== null && _j !== void 0 ? _j : null,
172
172
  referencedTypePath: (_k = newPropertyType.referencedTypePath) !== null && _k !== void 0 ? _k : null,
173
173
  referencedTypeRootSlug: (_l = newPropertyType.referencedTypeRootSlug) !== null && _l !== void 0 ? _l : null,
@@ -182,14 +182,14 @@ async function uploadReducedTypeProperties(type, currentPropertyTypes, newProper
182
182
  }
183
183
  }
184
184
  catch (err) {
185
- logger_1.default.info('Error Creating Properties: ', err);
185
+ logger_1.default.info(`Error Creating Properties: ${err}`);
186
186
  }
187
187
  }
188
188
  for (const currentPropertyType of currentPropertyTypes) {
189
189
  try {
190
190
  const found = newPropertyTypesBySlug[currentPropertyType.slug];
191
191
  if (!found && !currentPropertyType.inherited) {
192
- logger_1.default.info('Deleting Type-Property: ', currentPropertyType.slug);
192
+ logger_1.default.info(`Deleting Type-Property: ${currentPropertyType.slug}`);
193
193
  await sdk_1.Request.request(`/types/${type.id}/type-properties/${currentPropertyType.id}`, {
194
194
  method: 'DELETE',
195
195
  headers: {
@@ -204,7 +204,7 @@ async function uploadReducedTypeProperties(type, currentPropertyTypes, newProper
204
204
  }
205
205
  }
206
206
  }
207
- function typePropertiesEqual(typeProperty1, typeProperty2, optionSetIdByName) {
207
+ function typePropertiesEqual(typeProperty1, typeProperty2, optionSetIdByIdentifier) {
208
208
  const reducedProperty1 = {
209
209
  isArchived: typeProperty1.isArchived,
210
210
  propertyType: typeProperty1.propertyType,
@@ -213,7 +213,7 @@ function typePropertiesEqual(typeProperty1, typeProperty2, optionSetIdByName) {
213
213
  editable: typeProperty1.editable,
214
214
  searchable: typeProperty1.searchable,
215
215
  core: typeProperty1.core,
216
- typePropertyOptionSetId: optionSetIdByName[typeProperty1.typePropertyOptionSetName],
216
+ typePropertyOptionSetId: optionSetIdByIdentifier[typeProperty1.typePropertyOptionSetSlug],
217
217
  formula: typeProperty1.formula,
218
218
  referencedTypePath: typeProperty1.referencedTypePath,
219
219
  referencedTypeRootSlug: typeProperty1.referencedTypeRootSlug,
@@ -232,7 +232,7 @@ function typePropertiesEqual(typeProperty1, typeProperty2, optionSetIdByName) {
232
232
  editable: typeProperty2.editable,
233
233
  searchable: typeProperty2.searchable,
234
234
  core: typeProperty2.core,
235
- typePropertyOptionSetId: optionSetIdByName[typeProperty2.typePropertyOptionSetName],
235
+ typePropertyOptionSetId: optionSetIdByIdentifier[typeProperty2.typePropertyOptionSetSlug],
236
236
  formula: typeProperty2.formula,
237
237
  referencedTypePath: typeProperty2.referencedTypePath,
238
238
  referencedTypeRootSlug: typeProperty2.referencedTypeRootSlug,
@@ -14,7 +14,7 @@ class WorkflowTemplateDefinitionDeployer {
14
14
  async cliInstallWorkflowTemplateDefinitions() {
15
15
  const installedAppOrgs = await (0, apps_1.getInstalledApps)();
16
16
  if (!installedAppOrgs.length) {
17
- logger_1.default.info('%s \nNo apps are currently installed. You must install an app before installing its associated workflow template definitions.', chalk_1.default.red.bold('WORKFLOW DEFINITION'));
17
+ logger_1.default.warn('WORKFLOW DEFINITION \nNo apps are currently installed. You must install an app before installing its associated workflow template definitions.');
18
18
  return;
19
19
  }
20
20
  const answers = await inquirer_1.default.prompt([
@@ -69,7 +69,7 @@ class WorkflowTemplateDefinitionDeployer {
69
69
  };
70
70
  await (0, event_workflow_templates_1.createWorkflowTemplate)(newObject);
71
71
  }
72
- logger_1.default.info(`%s \n ${workflowTemplateDefinitionsToInstall.length} workflows installed`, chalk_1.default.green.bold('WORKFLOW DEFINITION'));
72
+ logger_1.default.info(`WORKFLOW DEFINITION \n ${workflowTemplateDefinitionsToInstall.length} workflows installed`);
73
73
  }
74
74
  async listWorkflowTemplateDefinitions() {
75
75
  const installedAppOrgs = await (0, apps_1.getInstalledApps)();
@@ -92,7 +92,7 @@ class WorkflowTemplateDefinitionDeployer {
92
92
  appVersionId: app.latestAppVersionId,
93
93
  });
94
94
  // UPSERT / DELETE BASED ON WORKFLOW IDENTIFIER
95
- logger_1.default.info('%s \tDeploying workflow definitions.', chalk_1.default.yellow.bold('WORKFLOW DEFINITION'));
95
+ logger_1.default.info('WORKFLOW DEFINITION \tDeploying workflow definitions.');
96
96
  if (appDeclaration.workflows) {
97
97
  const localWorkflows = Object.keys(appDeclaration.workflows);
98
98
  if ((localWorkflows === null || localWorkflows === void 0 ? void 0 : localWorkflows.length) > 0) {
@@ -103,7 +103,7 @@ class WorkflowTemplateDefinitionDeployer {
103
103
  }
104
104
  }
105
105
  async deployWorkflow(workflowKey, workflow, app, existingWorkflows) {
106
- logger_1.default.info(`%s \tDeploying workflow definitions: ${workflowKey}`, chalk_1.default.yellow.bold('WORKFLOW DEFINITION'));
106
+ logger_1.default.info(`WORKFLOW DEFINITION \tDeploying workflow definitions: ${workflowKey}`);
107
107
  const identifier = this.getWorkflowDeclarationIdentifier(workflowKey, app);
108
108
  const existingDefinition = existingWorkflows.find((ad) => ad.identifier === identifier);
109
109
  (0, interface_converters_1.convertWorkflow)(workflow);
@@ -127,7 +127,7 @@ class WorkflowTemplateDefinitionDeployer {
127
127
  parallelWorkerCount: workflowDeclaration.parallelWorkerCount,
128
128
  };
129
129
  const workflowTemplate = await (0, event_workflow_template_definition_1.createWorkflowTemplateDefinition)(newObject);
130
- logger_1.default.info(`%s Created new workflow definition definitions: ${workflowKey}`, chalk_1.default.yellow.bold('WORKFLOW DEFINITION'));
130
+ logger_1.default.info(`WORKFLOW DEFINITION \t Created new workflow definition definitions: ${workflowKey}`);
131
131
  return workflowTemplate;
132
132
  }
133
133
  async populateActionIds(workflowDefinition, app) {
@@ -169,7 +169,7 @@ class WorkflowTemplateDefinitionDeployer {
169
169
  id: existingWorkflowDefinition.id,
170
170
  updates,
171
171
  });
172
- logger_1.default.info(`%s Updated existing workflow definition: ${updatedWorkflowDefinition.identifier}`, chalk_1.default.yellow.bold('WORKFLOW DEFINITION'));
172
+ logger_1.default.info(`WORKFLOW DEFINITION \t Updated existing workflow definition: ${updatedWorkflowDefinition.identifier}`);
173
173
  return updatedWorkflowDefinition;
174
174
  }
175
175
  getActionDeclarationIdentifier(actionKey, app) {
@@ -27,7 +27,7 @@ class LocalWorkflowTemplateDeployer {
27
27
  }
28
28
  }
29
29
  async deployWorkflowTemplate(workflow, existingWorkflows, appIdentifier) {
30
- logger_1.default.info(`%s \tDeploying workflow: ${workflow.triggerKey}`, chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
30
+ logger_1.default.info(`WORKFLOW TEMPLATES \tDeploying workflow: ${workflow.triggerKey}`);
31
31
  const identifier = getWorkflowTemplateIdentifier(workflow);
32
32
  const existingTemplate = existingWorkflows.find((ad) => ad.identifier === identifier);
33
33
  (0, interface_converters_1.convertWorkflow)(workflow);
@@ -172,14 +172,14 @@ class LocalWorkflowTemplateDeployer {
172
172
  updates,
173
173
  });
174
174
  await this.updateWorkflowSchedule(workflowTemplate, updatedWorkflowTemplate.id);
175
- logger_1.default.info(`%s Updated existing workflow template: ${updatedWorkflowTemplate.identifier}`, chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
175
+ logger_1.default.info(`WORKFLOW TEMPLATES Updated existing workflow template: ${updatedWorkflowTemplate.identifier}`);
176
176
  return updatedWorkflowTemplate;
177
177
  }
178
178
  async deleteWorkflowTemplates(wtDeclaration) {
179
179
  // FETCH ALL WORKFLOWS FROM THE API.
180
180
  const existingWorkflows = await (0, event_workflow_templates_1.getExistingWorkflowTemplates)();
181
181
  // UPSERT / DELETE BASED ON WORKFLOW TEMPLATES IDENTIFIER
182
- logger_1.default.info('%s \tDELETING workflow templates.', chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'));
182
+ logger_1.default.info('WORKFLOW TEMPLATES \tDELETING workflow templates.');
183
183
  for (const workflowKey of Object.keys(wtDeclaration.workflows)) {
184
184
  const identifier = getWorkflowTemplateIdentifier(wtDeclaration.workflows[workflowKey]);
185
185
  const existingTemplate = existingWorkflows.find((ad) => ad.identifier === identifier);
@@ -188,11 +188,11 @@ class LocalWorkflowTemplateDeployer {
188
188
  await (0, event_workflow_templates_1.deleteWorkflowTemplate)(identifier);
189
189
  }
190
190
  catch (e) {
191
- logger_1.default.info('%s \tFAILED to delete workflow template %s.', chalk_1.default.red.bold('WORKFLOW TEMPLATES'), identifier);
191
+ logger_1.default.warn('WORKFLOW TEMPLATES \tFAILED to delete workflow template WORKFLOW TEMPLATES.', chalk_1.default.red.bold('WORKFLOW TEMPLATES'), identifier);
192
192
  }
193
193
  }
194
194
  else {
195
- logger_1.default.info('%s \tUnable to locate workflow template %s.', chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'), identifier);
195
+ logger_1.default.info('WORKFLOW TEMPLATES \tUnable to locate workflow template WORKFLOW TEMPLATES.', chalk_1.default.yellow.bold('WORKFLOW TEMPLATES'), identifier);
196
196
  }
197
197
  }
198
198
  }
@@ -224,7 +224,7 @@ class WorkflowTemplateDeployer {
224
224
  for (const idToDelete of answers.wfTemplatesToDelete) {
225
225
  await (0, event_workflow_templates_1.deleteWorkflowTemplate)(idToDelete);
226
226
  }
227
- logger_1.default.info('%s \tDeleted workflow templates!', chalk_1.default.green.bold('WORKFLOW TEMPLATES'));
227
+ logger_1.default.info('WORKFLOW TEMPLATES \tDeleted workflow templates!');
228
228
  }
229
229
  async listExistingWorkflowTemplates() {
230
230
  const templates = await (0, event_workflow_templates_1.getExistingWorkflowTemplates)();
@@ -247,7 +247,7 @@ async function localDeployWorkflowTemplate(saveFileLocation) {
247
247
  wtDeclaration = loadTemplateConfig(saveFileLocation);
248
248
  }
249
249
  catch (e) {
250
- logger_1.default.info(`%s Workflow Deletion Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
250
+ logger_1.default.error(`FAIL Workflow Deletion Failed . ${e}`);
251
251
  return;
252
252
  }
253
253
  await (0, login_1.authUser)();
@@ -329,7 +329,7 @@ export interface ReducedTypeProperty {
329
329
  editable: boolean;
330
330
  searchable: boolean;
331
331
  core: boolean;
332
- typePropertyOptionSetName: string;
332
+ typePropertyOptionSetSlug: string;
333
333
  formula: string;
334
334
  referencedTypePath: string;
335
335
  referencedTypeRootSlug: string;
@@ -343,6 +343,7 @@ export interface ReducedTypeProperty {
343
343
  }
344
344
  export interface ReducedOptionSet {
345
345
  name: string;
346
+ identifier: string;
346
347
  isArchived: boolean;
347
348
  optionSet: any[];
348
349
  }
@@ -4,7 +4,7 @@ appDescription: "APP_DESCRIPTION_STUB" # Give your app a description
4
4
  visibility: private # This should be private unless you want to develop an app for all VibeIQ customers to use
5
5
  hidden: false # can be used with a public app to prevent it from showing on the marketplace, but still installable by other orgs
6
6
  publisher: "Your company name" # Your company name, used for public apps
7
- version: 1.0
7
+ version: 1.0.0
8
8
 
9
9
  # Properties you can configure when you install the app.
10
10
  # These property values will be available to all of your actions when they run