@contrail/cli 2.1.28 → 2.2.1
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/README.md +86 -2
- package/dist/commands/app/create.js +3 -4
- package/dist/commands/app/delete.js +5 -5
- package/dist/commands/app/init.d.ts +6 -0
- package/dist/commands/app/init.js +63 -0
- package/dist/commands/app/publish.js +3 -3
- package/dist/commands/app/version/major.d.ts +7 -0
- package/dist/commands/app/version/major.js +40 -0
- package/dist/commands/app/version/minor.d.ts +7 -0
- package/dist/commands/app/version/minor.js +40 -0
- package/dist/commands/app/version/patch.d.ts +7 -0
- package/dist/commands/app/version/patch.js +40 -0
- package/dist/commands/colors/deleteAll.js +3 -3
- package/dist/commands/colors/load.js +5 -5
- package/dist/commands/config/environments/remove.js +2 -2
- package/dist/commands/config/environments/set.js +1 -1
- package/dist/commands/groups/export.js +1 -1
- package/dist/commands/loader-process/load.js +4 -4
- package/dist/commands/loader-process/upload-and-load.js +4 -4
- package/dist/commands/projects/load.js +2 -2
- package/dist/commands/types/exportOptionSetHierarchies.js +4 -4
- package/dist/commands/types/getAll.js +31 -25
- package/dist/commands/types/loadAll.js +2 -2
- package/dist/commands/types/mergeOptionSets.js +5 -4
- package/dist/commands/types/mergeTypeProperties.js +2 -2
- package/dist/commands/types/parseOptionSetsHierarchyLocalFile.js +4 -4
- package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.js +2 -2
- package/dist/commands/types/parseOptionSetsLocalFiles.js +2 -2
- package/dist/commands/types/parseOptionSetsToFolderStructure.js +2 -2
- package/dist/commands/types/parseTypesFromFiles.js +2 -2
- package/dist/commands/types/parseTypesFromLocalFiles.js +2 -2
- package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.js +2 -2
- package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.js +2 -2
- package/dist/commands/types/uploadOptionSetHierarchies.js +30 -20
- package/dist/commands/types/uploadOptionSets.js +16 -15
- package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.js +5 -5
- package/dist/commands/types/uploadRuleSets.js +20 -22
- package/dist/commands/types/uploadTypePolicies.js +23 -23
- package/dist/commands/types/uploadTypePropertyPolicies.js +14 -14
- package/dist/commands/types/uploadUsageInfo.js +12 -12
- package/dist/commands/webhooks/create.js +2 -4
- package/dist/commands/webhooks/list.js +2 -4
- package/dist/helpers/app/actions-deployer.js +4 -4
- package/dist/helpers/app/app-deployer.js +9 -9
- package/dist/helpers/app/extensions-deployer.js +4 -4
- package/dist/helpers/app/update-app-config.d.ts +2 -0
- package/dist/helpers/app/update-app-config.js +20 -0
- package/dist/helpers/app/upgrade-version.d.ts +16 -0
- package/dist/helpers/app/upgrade-version.js +37 -0
- package/dist/helpers/app/upgrade-version.spec.d.ts +1 -0
- package/dist/helpers/app/upgrade-version.spec.js +33 -0
- package/dist/helpers/colors/helpers.js +2 -2
- package/dist/helpers/loader-process/helpers.js +4 -4
- package/dist/helpers/projects/helpers.js +1 -1
- package/dist/helpers/types/csv-parser.js +6 -6
- package/dist/helpers/types/type-extractor.js +1 -1
- package/dist/helpers/types/type-parser.js +11 -11
- package/dist/helpers/types/type-uploader.js +21 -21
- package/dist/helpers/workflow-template-definitions/workflow-template-definition-deployer.js +6 -6
- package/dist/helpers/workflow-templates/helper.js +7 -7
- package/dist/interfaces.d.ts +2 -1
- package/dist/templates/typescript/app.yml +1 -1
- package/dist/templates/typescript/package.json +2 -2
- package/oclif.manifest.json +150 -2
- 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(
|
|
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(
|
|
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(
|
|
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(
|
|
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,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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
30
|
-
logger_1.default.info(
|
|
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.
|
|
37
|
-
|
|
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}
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
17
|
-
logger_1.default.info('
|
|
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(
|
|
19
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES')} Uploaded`);
|
|
20
20
|
}
|
|
21
21
|
catch (e) {
|
|
22
|
-
logger_1.default.info(
|
|
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(
|
|
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(
|
|
69
|
+
logger_1.default.info(`Cannot create a base type. Skipping: ${type.slug}`);
|
|
70
70
|
continue;
|
|
71
71
|
}
|
|
72
|
-
logger_1.default.info(
|
|
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(
|
|
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(
|
|
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
|
|
119
|
+
const optionSetIdByIdentifier = {};
|
|
120
120
|
for (const optionSet of optionSets) {
|
|
121
|
-
|
|
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(
|
|
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:
|
|
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,
|
|
158
|
-
logger_1.default.info(
|
|
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 =
|
|
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(
|
|
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(
|
|
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,
|
|
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:
|
|
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:
|
|
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.
|
|
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(
|
|
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('
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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('
|
|
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.
|
|
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('
|
|
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('
|
|
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.
|
|
250
|
+
logger_1.default.error(`FAIL Workflow Deletion Failed . ${e}`);
|
|
251
251
|
return;
|
|
252
252
|
}
|
|
253
253
|
await (0, login_1.authUser)();
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -329,7 +329,7 @@ export interface ReducedTypeProperty {
|
|
|
329
329
|
editable: boolean;
|
|
330
330
|
searchable: boolean;
|
|
331
331
|
core: boolean;
|
|
332
|
-
|
|
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
|