@celonis/content-cli 0.3.4 → 0.4.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/api/compute-pool-api.js +2 -3
- package/api/node-api.js +7 -0
- package/api/package-api.js +55 -0
- package/api/package-dependencies-api.js +29 -0
- package/api/space-api.js +48 -0
- package/commands/package.command.js +11 -1
- package/content-cli-export.js +61 -0
- package/content-cli-import.js +61 -0
- package/content-cli.js +2 -0
- package/interfaces/manifest-transport.js +12 -0
- package/lib/api/node-api.d.ts +1 -0
- package/lib/api/package-api.d.ts +9 -1
- package/lib/api/package-dependencies-api.d.ts +4 -0
- package/lib/api/space-api.d.ts +9 -0
- package/lib/commands/package.command.d.ts +2 -0
- package/lib/content-cli-export.d.ts +4 -0
- package/lib/content-cli-import.d.ts +4 -0
- package/lib/interfaces/batch-export-node-transport.d.ts +10 -0
- package/lib/interfaces/manifest-transport.d.ts +27 -0
- package/lib/interfaces/package-manager.interfaces.d.ts +10 -0
- package/lib/interfaces/save-space.interface.d.ts +2 -1
- package/lib/services/file-service.d.ts +3 -0
- package/lib/services/http-client-service.v2.d.ts +8 -0
- package/lib/services/package-manager/datamodel-service.d.ts +2 -1
- package/lib/services/package-manager/package-service.d.ts +21 -4
- package/lib/services/package-manager/space-service.d.ts +11 -0
- package/lib/services/package-manager/variable-service.d.ts +3 -2
- package/package.json +1 -1
- package/services/file-service.js +9 -1
- package/services/http-client-service.v2.js +91 -3
- package/services/package-manager/datamodel-service.js +6 -8
- package/services/package-manager/package-service.js +331 -34
- package/services/package-manager/space-service.js +61 -0
- package/services/package-manager/variable-service.js +2 -7
package/services/file-service.js
CHANGED
|
@@ -4,19 +4,27 @@
|
|
|
4
4
|
if (v !== undefined) module.exports = v;
|
|
5
5
|
}
|
|
6
6
|
else if (typeof define === "function" && define.amd) {
|
|
7
|
-
define(["require", "exports", "fs", "path"], factory);
|
|
7
|
+
define(["require", "exports", "fs", "path", "yaml"], factory);
|
|
8
8
|
}
|
|
9
9
|
})(function (require, exports) {
|
|
10
10
|
"use strict";
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const fs = require("fs");
|
|
13
13
|
const path = require("path");
|
|
14
|
+
const YAML = require("yaml");
|
|
14
15
|
class FileService {
|
|
15
16
|
writeToFileWithGivenName(data, filename) {
|
|
16
17
|
fs.writeFileSync(path.resolve(process.cwd(), filename), this.getSerializedFileContent(data), {
|
|
17
18
|
encoding: "utf-8",
|
|
18
19
|
});
|
|
19
20
|
}
|
|
21
|
+
createDirectoryWithGivenName(dirName) {
|
|
22
|
+
fs.mkdirSync(path.resolve(process.cwd(), dirName));
|
|
23
|
+
}
|
|
24
|
+
readManifestFile(importedFileName) {
|
|
25
|
+
const manifest = YAML.parse(fs.readFileSync(path.resolve(importedFileName + "/manifest.yml"), { encoding: "utf-8" }));
|
|
26
|
+
return Promise.all(manifest);
|
|
27
|
+
}
|
|
20
28
|
getSerializedFileContent(data) {
|
|
21
29
|
return data;
|
|
22
30
|
}
|
|
@@ -13,7 +13,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
13
13
|
if (v !== undefined) module.exports = v;
|
|
14
14
|
}
|
|
15
15
|
else if (typeof define === "function" && define.amd) {
|
|
16
|
-
define(["require", "exports", "../interfaces/profile.interface", "request", "./context.service", "../util/logger"], factory);
|
|
16
|
+
define(["require", "exports", "../interfaces/profile.interface", "request", "./context.service", "../util/logger", "querystring"], factory);
|
|
17
17
|
}
|
|
18
18
|
})(function (require, exports) {
|
|
19
19
|
"use strict";
|
|
@@ -22,6 +22,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
22
22
|
const request = require("request");
|
|
23
23
|
const context_service_1 = require("./context.service");
|
|
24
24
|
const logger_1 = require("../util/logger");
|
|
25
|
+
const querystring = require("querystring");
|
|
25
26
|
class HttpClientServiceV2 {
|
|
26
27
|
get(url) {
|
|
27
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -34,9 +35,90 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
34
35
|
});
|
|
35
36
|
});
|
|
36
37
|
}
|
|
38
|
+
postFile(url, body, parameters) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
request.post(this.resolveUrl(url) + "?" + querystring.stringify(parameters), this.makeOptions(context_service_1.contextService.getContext().profile, body), (err, res) => {
|
|
42
|
+
this.handleResponse(res, resolve, reject);
|
|
43
|
+
});
|
|
44
|
+
}).catch(e => {
|
|
45
|
+
throw new logger_1.FatalError(e);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
post(url, body) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
request.post(this.resolveUrl(url), this.makeOptionsJson(context_service_1.contextService.getContext().profile, JSON.stringify(body), "application/json;charset=utf-8"), (err, res) => {
|
|
53
|
+
this.handleResponse(res, resolve, reject);
|
|
54
|
+
});
|
|
55
|
+
}).catch(e => {
|
|
56
|
+
throw new logger_1.FatalError(e);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
put(url, body) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
request.put(this.resolveUrl(url), this.makeOptionsJson(context_service_1.contextService.getContext().profile, JSON.stringify(body), "application/json;charset=utf-8"), (err, res) => {
|
|
64
|
+
this.handleResponse(res, resolve, reject);
|
|
65
|
+
});
|
|
66
|
+
}).catch(e => {
|
|
67
|
+
throw new logger_1.FatalError(e);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
delete(url) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
request.delete(this.resolveUrl(url), this.makeOptionsJson(context_service_1.contextService.getContext().profile, "application/json;charset=utf-8"), (err, res) => {
|
|
75
|
+
this.handleResponse(res, resolve, reject);
|
|
76
|
+
});
|
|
77
|
+
}).catch(e => {
|
|
78
|
+
throw new logger_1.FatalError(e);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
downloadFile(url) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
request
|
|
86
|
+
.post(this.resolveUrl(url), this.makeFileDownloadOptions(context_service_1.contextService.getContext().profile))
|
|
87
|
+
.on("response", (response) => {
|
|
88
|
+
const data = [];
|
|
89
|
+
response.on("data", (chunk) => {
|
|
90
|
+
data.push(chunk);
|
|
91
|
+
});
|
|
92
|
+
response.on("end", () => {
|
|
93
|
+
if (this.checkBadRequest(response.statusCode)) {
|
|
94
|
+
this.handleBadRequest(response.statusCode, data.toString(), reject);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.handleResponseStreamData(Buffer.concat(data), resolve, reject);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
})
|
|
101
|
+
.on("error", error => reject(error));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
handleResponseStreamData(data, resolve, reject) {
|
|
106
|
+
if (data) {
|
|
107
|
+
resolve(data);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
logger_1.logger.error("Could not get file stream from response");
|
|
111
|
+
reject();
|
|
112
|
+
}
|
|
37
113
|
resolveUrl(url) {
|
|
38
114
|
return context_service_1.contextService.getContext().profile.team.replace(/\/?$/, url);
|
|
39
115
|
}
|
|
116
|
+
makeFileDownloadOptions(profile) {
|
|
117
|
+
return {
|
|
118
|
+
headers: this.buildAuthorizationHeaders(profile),
|
|
119
|
+
responseType: "binary",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
40
122
|
handleResponse(res, resolve, reject) {
|
|
41
123
|
if (this.checkBadRequest(res.statusCode)) {
|
|
42
124
|
this.handleBadRequest(res.statusCode, res.body, reject);
|
|
@@ -72,11 +154,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
72
154
|
};
|
|
73
155
|
return Object.assign(options, body);
|
|
74
156
|
}
|
|
75
|
-
|
|
157
|
+
makeOptionsJson(profile, body, contentType) {
|
|
158
|
+
return {
|
|
159
|
+
headers: this.buildAuthorizationHeaders(profile, contentType),
|
|
160
|
+
body: body
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
buildAuthorizationHeaders(profile, contentType) {
|
|
76
164
|
const authenticationType = profile.authenticationType || profile_interface_1.AuthenticationType.BEARER;
|
|
77
165
|
return {
|
|
78
166
|
authorization: `${authenticationType} ${profile.apiToken}`,
|
|
79
|
-
"content-type": "application/json",
|
|
167
|
+
"content-type": contentType !== null && contentType !== void 0 ? contentType : "application/json",
|
|
80
168
|
};
|
|
81
169
|
}
|
|
82
170
|
}
|
|
@@ -22,14 +22,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
22
22
|
class DatamodelService {
|
|
23
23
|
getDatamodelsForNodes(nodesListToExport) {
|
|
24
24
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
});
|
|
32
|
-
return Promise.all(promises);
|
|
25
|
+
const dataModelsMap = new Map();
|
|
26
|
+
for (const node of nodesListToExport) {
|
|
27
|
+
const assignedDataModels = yield compute_pool_api_1.computePoolApi.findAssignedDatamodels(node.key);
|
|
28
|
+
dataModelsMap.set(node.key, assignedDataModels);
|
|
29
|
+
}
|
|
30
|
+
return dataModelsMap;
|
|
33
31
|
});
|
|
34
32
|
}
|
|
35
33
|
}
|
|
@@ -13,7 +13,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
13
13
|
if (v !== undefined) module.exports = v;
|
|
14
14
|
}
|
|
15
15
|
else if (typeof define === "function" && define.amd) {
|
|
16
|
-
define(["require", "exports", "../../util/logger", "../../api/package-api", "uuid", "../file-service", "./datamodel-service", "../../api/node-api", "../../api/package-dependencies-api"], factory);
|
|
16
|
+
define(["require", "exports", "../../util/logger", "../../api/package-api", "uuid", "../file-service", "./datamodel-service", "../../api/node-api", "../../api/package-dependencies-api", "./variable-service", "./space-service", "yaml", "fs", "adm-zip", "path", "os"], factory);
|
|
17
17
|
}
|
|
18
18
|
})(function (require, exports) {
|
|
19
19
|
"use strict";
|
|
@@ -25,6 +25,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
25
25
|
const datamodel_service_1 = require("./datamodel-service");
|
|
26
26
|
const node_api_1 = require("../../api/node-api");
|
|
27
27
|
const package_dependencies_api_1 = require("../../api/package-dependencies-api");
|
|
28
|
+
const variable_service_1 = require("./variable-service");
|
|
29
|
+
const space_service_1 = require("./space-service");
|
|
30
|
+
const YAML = require("yaml");
|
|
31
|
+
const fs = require("fs");
|
|
32
|
+
const AdmZip = require("adm-zip");
|
|
33
|
+
const path = require("path");
|
|
34
|
+
const os_1 = require("os");
|
|
28
35
|
class PackageService {
|
|
29
36
|
constructor() {
|
|
30
37
|
this.fileDownloadedMessage = "File downloaded successfully. New filename: ";
|
|
@@ -37,73 +44,363 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
37
44
|
});
|
|
38
45
|
});
|
|
39
46
|
}
|
|
40
|
-
|
|
47
|
+
findAndExportListOfAllPackages(includeDependencies) {
|
|
41
48
|
return __awaiter(this, void 0, void 0, function* () {
|
|
42
49
|
const fieldsToInclude = ["key", "name", "changeDate", "activatedDraftId", "spaceId"];
|
|
43
50
|
let nodesListToExport = yield package_api_1.packageApi.findAllPackages();
|
|
44
51
|
if (includeDependencies) {
|
|
45
|
-
fieldsToInclude.push("type", "value", "dependencies", "id", "version", "poolId", "node", "dataModelId", "dataPool", "datamodels");
|
|
52
|
+
fieldsToInclude.push("type", "value", "dependencies", "id", "updateAvailable", "version", "poolId", "node", "dataModelId", "dataPool", "datamodels");
|
|
46
53
|
const packagesKeyWithActionFlows = (yield node_api_1.nodeApi.findAllNodesOfType("SCENARIO")).map(node => node.rootNodeKey);
|
|
47
54
|
nodesListToExport = nodesListToExport.filter(node => {
|
|
48
55
|
return !packagesKeyWithActionFlows.includes(node.rootNodeKey);
|
|
49
56
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
const unPublishedNodes = nodesListToExport.filter(node => !node.activatedDraftId);
|
|
58
|
+
let publishedNodes = nodesListToExport.filter(node => node.activatedDraftId);
|
|
59
|
+
publishedNodes = yield this.getNodesWithActiveVersion(publishedNodes);
|
|
60
|
+
nodesListToExport = [...publishedNodes, ...unPublishedNodes];
|
|
61
|
+
const dataModelAssignments = yield datamodel_service_1.dataModelService.getDatamodelsForNodes(nodesListToExport);
|
|
62
|
+
nodesListToExport.forEach(node => {
|
|
63
|
+
node.datamodels = dataModelAssignments.get(node.key);
|
|
57
64
|
});
|
|
58
|
-
const
|
|
65
|
+
const draftIdByNodeId = new Map();
|
|
66
|
+
nodesListToExport.forEach(node => draftIdByNodeId.set(node.workingDraftId, node.id));
|
|
67
|
+
const dependenciesByPackageIds = yield this.getPackagesWithDependencies(draftIdByNodeId, packagesKeyWithActionFlows);
|
|
59
68
|
nodesListToExport = nodesListToExport.map(nodeToExport => {
|
|
60
|
-
|
|
69
|
+
var _a;
|
|
70
|
+
nodeToExport.dependencies = (_a = dependenciesByPackageIds[nodeToExport.workingDraftId]) !== null && _a !== void 0 ? _a : [];
|
|
61
71
|
return nodeToExport;
|
|
62
72
|
});
|
|
63
73
|
}
|
|
64
74
|
this.exportListOfPackages(nodesListToExport, fieldsToInclude);
|
|
65
75
|
});
|
|
66
76
|
}
|
|
67
|
-
|
|
77
|
+
batchImportPackages(spaceMappings, exportedPackagesFile) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
exportedPackagesFile = exportedPackagesFile + (exportedPackagesFile.includes(".zip") ? "" : ".zip");
|
|
80
|
+
const zip = new AdmZip(exportedPackagesFile);
|
|
81
|
+
const importedFilePath = path.resolve(os_1.tmpdir(), "export_" + uuid_1.v4());
|
|
82
|
+
yield fs.mkdirSync(importedFilePath);
|
|
83
|
+
yield zip.extractAllTo(importedFilePath);
|
|
84
|
+
const manifestNodes = yield file_service_1.fileService.readManifestFile(importedFilePath);
|
|
85
|
+
manifestNodes.map(node => node.dependenciesByVersion = new Map(Object.entries(node.dependenciesByVersion)));
|
|
86
|
+
const importedVersionsByNodeKey = new Map();
|
|
87
|
+
const sourceToTargetVersionsByNodeKey = new Map();
|
|
88
|
+
for (const node of manifestNodes) {
|
|
89
|
+
for (const version of node.dependenciesByVersion.keys()) {
|
|
90
|
+
yield this.checkNodeForCircularDependency(node, version, manifestNodes, []);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const customSpacesMap = new Map();
|
|
94
|
+
spaceMappings.forEach(spaceMap => {
|
|
95
|
+
const packageAndSpaceid = spaceMap.split(":");
|
|
96
|
+
customSpacesMap.set(packageAndSpaceid[0], packageAndSpaceid[1]);
|
|
97
|
+
});
|
|
98
|
+
const draftIdsByPackageKeyAndVersion = new Map();
|
|
99
|
+
for (const node of manifestNodes) {
|
|
100
|
+
yield this.importPackage(node, manifestNodes, sourceToTargetVersionsByNodeKey, customSpacesMap, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
checkNodeForCircularDependency(node, version, manifestNodes, iteratedNodeAndVersions) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
const dependencies = node.dependenciesByVersion.get(version);
|
|
107
|
+
if (iteratedNodeAndVersions.includes(`${node.packageKey}_${version}`)) {
|
|
108
|
+
throw new Error("Circular dependency detected!");
|
|
109
|
+
}
|
|
110
|
+
iteratedNodeAndVersions.push(`${node.packageKey}_${version}`);
|
|
111
|
+
for (const dependency of dependencies) {
|
|
112
|
+
const manifestNodeOfDependency = manifestNodes.find(manifestNode => manifestNode.packageKey === dependency.key);
|
|
113
|
+
yield this.checkNodeForCircularDependency(manifestNodeOfDependency, dependency.version, manifestNodes, iteratedNodeAndVersions);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
importPackage(packageToImport, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath) {
|
|
118
|
+
var _a;
|
|
119
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
const importedPackageVersion = (_a = importedVersionsByNodeKey.get(packageToImport.packageKey)) !== null && _a !== void 0 ? _a : [];
|
|
121
|
+
const versionsOfPackage = [...packageToImport.dependenciesByVersion.keys()].sort((k1, k2) => this.compareVersions(k1, k2)).filter(version => !importedPackageVersion.includes(version));
|
|
122
|
+
for (const version of versionsOfPackage) {
|
|
123
|
+
yield this.importPackageVersion(packageToImport, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath, version);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
compareVersions(version1, version2) {
|
|
128
|
+
const splitVersion1 = version1.split(".");
|
|
129
|
+
const splitVersion2 = version2.split(".");
|
|
130
|
+
const majorVersion1 = splitVersion1[0];
|
|
131
|
+
const majorVersion2 = splitVersion2[0];
|
|
132
|
+
const minorVersion1 = splitVersion1[1];
|
|
133
|
+
const minorVersion2 = splitVersion2[1];
|
|
134
|
+
const patchVersion1 = splitVersion1[2];
|
|
135
|
+
const patchVersion2 = splitVersion2[2];
|
|
136
|
+
const firstVersionIsGreaterThanFirst = (majorVersion1 > majorVersion2) || (minorVersion1 > minorVersion2) || (patchVersion1 > patchVersion2);
|
|
137
|
+
return firstVersionIsGreaterThanFirst ? 1 : -1;
|
|
138
|
+
}
|
|
139
|
+
importPackageVersion(packageToImport, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath, versionOfPackageBeingImported) {
|
|
140
|
+
var _a, _b;
|
|
141
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
if (packageToImport.dependenciesByVersion.get(versionOfPackageBeingImported).length) {
|
|
143
|
+
const dependenciesOfPackageVersion = packageToImport.dependenciesByVersion.get(versionOfPackageBeingImported);
|
|
144
|
+
yield this.importDependencyPackages(dependenciesOfPackageVersion, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath);
|
|
145
|
+
}
|
|
146
|
+
if (this.checkIfPackageVersionHasBeenImported(packageToImport.packageKey, versionOfPackageBeingImported, importedVersionsByNodeKey)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const targetSpace = yield this.getTargetSpaceForExportedPackage(packageToImport, spaceMappings);
|
|
150
|
+
let nodeInTargetTeam = yield node_api_1.nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey);
|
|
151
|
+
const pathToZipFile = path.resolve(importedFilePath, packageToImport.packageKey + "_" + versionOfPackageBeingImported + ".zip");
|
|
152
|
+
const packageZip = yield this.createBodyForImport(pathToZipFile);
|
|
153
|
+
yield package_api_1.packageApi.importPackage(packageZip, targetSpace.id, !!nodeInTargetTeam);
|
|
154
|
+
if (nodeInTargetTeam) {
|
|
155
|
+
yield package_api_1.packageApi.movePackageToSpace(nodeInTargetTeam.id, targetSpace.id);
|
|
156
|
+
}
|
|
157
|
+
nodeInTargetTeam = yield node_api_1.nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey);
|
|
158
|
+
draftIdsByPackageKeyAndVersion.set(`${nodeInTargetTeam.key}_${versionOfPackageBeingImported}`, nodeInTargetTeam.workingDraftId);
|
|
159
|
+
yield this.updateDependencyVersions(packageToImport, versionOfPackageBeingImported, sourceToTargetVersionsByNodeKey, draftIdsByPackageKeyAndVersion);
|
|
160
|
+
yield this.publishPackage(packageToImport);
|
|
161
|
+
const packageVersionInTargetTeam = yield package_api_1.packageApi.findActiveVersionById(nodeInTargetTeam.id);
|
|
162
|
+
const mappedVersions = (_a = sourceToTargetVersionsByNodeKey.get(packageToImport.packageKey)) !== null && _a !== void 0 ? _a : new Map();
|
|
163
|
+
mappedVersions.set(versionOfPackageBeingImported, packageVersionInTargetTeam.version);
|
|
164
|
+
sourceToTargetVersionsByNodeKey.set(packageToImport.packageKey, mappedVersions);
|
|
165
|
+
const importedVersionsOfPackage = (_b = importedVersionsByNodeKey.get(packageToImport.packageKey)) !== null && _b !== void 0 ? _b : [];
|
|
166
|
+
importedVersionsOfPackage.push(versionOfPackageBeingImported);
|
|
167
|
+
importedVersionsByNodeKey.set(packageToImport.packageKey, importedVersionsOfPackage);
|
|
168
|
+
const mappedVersion = sourceToTargetVersionsByNodeKey.get(packageToImport.packageKey).get(versionOfPackageBeingImported);
|
|
169
|
+
logger_1.logger.info(`Imported package with key: ${packageToImport.packageKey} ${versionOfPackageBeingImported} successfully. New version: ${mappedVersion}`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
importDependencyPackages(dependenciesToImport, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
for (const dependency of dependenciesToImport) {
|
|
175
|
+
if (this.checkIfPackageVersionHasBeenImported(dependency.key, dependency.version, importedVersionsByNodeKey)) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const dependentPackage = manifestNodes.find((node) => node.packageKey === dependency.key);
|
|
179
|
+
yield this.importPackage(dependentPackage, manifestNodes, sourceToTargetVersionsByNodeKey, spaceMappings, importedVersionsByNodeKey, draftIdsByPackageKeyAndVersion, importedFilePath);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
checkIfPackageVersionHasBeenImported(packageKey, version, importedVersions) {
|
|
184
|
+
var _a;
|
|
185
|
+
const importedPackages = (_a = importedVersions.get(packageKey)) !== null && _a !== void 0 ? _a : [];
|
|
186
|
+
return importedPackages.includes(version);
|
|
187
|
+
}
|
|
188
|
+
createBodyForImport(filename) {
|
|
189
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
190
|
+
return {
|
|
191
|
+
formData: {
|
|
192
|
+
package: yield fs.createReadStream(filename, { encoding: null })
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
getTargetSpaceForExportedPackage(packageToImport, spaceMappings) {
|
|
198
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
199
|
+
let targetSpace;
|
|
200
|
+
const allSpaces = yield space_service_1.spaceService.getAllSpaces();
|
|
201
|
+
if (spaceMappings.has(packageToImport.packageKey)) {
|
|
202
|
+
const customSpaceId = spaceMappings.get(packageToImport.packageKey);
|
|
203
|
+
const customSpace = allSpaces.find(space => space.id === customSpaceId);
|
|
204
|
+
if (!customSpace) {
|
|
205
|
+
throw Error("Provided space id does not exist");
|
|
206
|
+
}
|
|
207
|
+
targetSpace = customSpace;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
targetSpace = allSpaces.find(space => space.name === packageToImport.space.spaceName);
|
|
211
|
+
if (!targetSpace) {
|
|
212
|
+
targetSpace = yield space_service_1.spaceService.createSpace(packageToImport.space.spaceName, packageToImport.space.spaceIcon);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return targetSpace;
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
updateDependencyVersions(node, versionOfPackage, sourceToTargetVersionsByNodeKey, draftIdsByPackageKeyAndVersion) {
|
|
219
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
220
|
+
const createdNode = yield node_api_1.nodeApi.findOneByKeyAndRootNodeKey(node.packageKey, node.packageKey);
|
|
221
|
+
const newDependencies = [];
|
|
222
|
+
for (const dependency of [...node.dependenciesByVersion.get(versionOfPackage)]) {
|
|
223
|
+
const nodeInTargetTeam = yield node_api_1.nodeApi.findOneByKeyAndRootNodeKey(dependency.key, dependency.key);
|
|
224
|
+
const draftIdOfVersionedDependency = draftIdsByPackageKeyAndVersion.get(`${dependency.key}_${dependency.version}`);
|
|
225
|
+
dependency.version = sourceToTargetVersionsByNodeKey.get(dependency.key).get(dependency.version);
|
|
226
|
+
dependency.updateAvailable = dependency.updateAvailable;
|
|
227
|
+
dependency.id = nodeInTargetTeam.rootNodeId;
|
|
228
|
+
dependency.rootNodeId = createdNode.rootNodeId;
|
|
229
|
+
dependency.draftId = draftIdOfVersionedDependency;
|
|
230
|
+
newDependencies.push(dependency);
|
|
231
|
+
yield package_dependencies_api_1.packageDependenciesApi.deleteDependency(createdNode.id, dependency.key);
|
|
232
|
+
}
|
|
233
|
+
if (newDependencies.length) {
|
|
234
|
+
yield package_dependencies_api_1.packageDependenciesApi.createDependencies(createdNode.id, newDependencies);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
publishPackage(packageToImport) {
|
|
239
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
240
|
+
const nodeInTargetTeam = yield node_api_1.nodeApi.findOneByKeyAndRootNodeKey(packageToImport.packageKey, packageToImport.packageKey);
|
|
241
|
+
const nextVersion = yield package_api_1.packageApi.findNextVersion(nodeInTargetTeam.id);
|
|
242
|
+
yield package_api_1.packageApi.publishPackage({
|
|
243
|
+
packageKey: packageToImport.packageKey,
|
|
244
|
+
version: nextVersion.version,
|
|
245
|
+
publishMessage: "Published package after import",
|
|
246
|
+
nodeIdsToExclude: []
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
batchExportPackages(packageKeys, includeDependencies) {
|
|
68
251
|
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
252
|
+
const allPackages = yield package_api_1.packageApi.findAllPackages();
|
|
253
|
+
let nodesListToExport = allPackages.filter(node => packageKeys.includes(node.key));
|
|
254
|
+
const actionFlowsPackageKeys = (yield node_api_1.nodeApi.findAllNodesOfType("SCENARIO")).map(node => node.rootNodeKey);
|
|
255
|
+
nodesListToExport = nodesListToExport.filter(node => !actionFlowsPackageKeys.includes(node.key));
|
|
256
|
+
const versionsByNodeKey = new Map();
|
|
257
|
+
const allPackageKeys = allPackages.map(p => p.key);
|
|
258
|
+
for (const packageKey of packageKeys) {
|
|
259
|
+
if (!allPackageKeys.includes(packageKey)) {
|
|
260
|
+
throw new Error(`Package ${packageKey} does not exist.`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
nodesListToExport = yield this.getNodesWithActiveVersion(nodesListToExport);
|
|
264
|
+
if (includeDependencies) {
|
|
265
|
+
const dependencyPackages = yield this.getDependencyPackages(nodesListToExport, [], allPackages, actionFlowsPackageKeys, [], versionsByNodeKey);
|
|
266
|
+
nodesListToExport.push(...dependencyPackages);
|
|
267
|
+
}
|
|
268
|
+
const variableAssignments = yield variable_service_1.variableService.getVariableAssignmentsForNodes(nodesListToExport);
|
|
269
|
+
nodesListToExport.forEach(node => {
|
|
72
270
|
var _a;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
271
|
+
node.variables = (_a = variableAssignments.find(nodeWithVariablesAssignment => nodeWithVariablesAssignment.key === node.key)) === null || _a === void 0 ? void 0 : _a.variableAssignments;
|
|
272
|
+
});
|
|
273
|
+
const dataModelAssignments = yield datamodel_service_1.dataModelService.getDatamodelsForNodes(nodesListToExport);
|
|
274
|
+
nodesListToExport.forEach(node => {
|
|
275
|
+
node.datamodels = dataModelAssignments.get(node.key);
|
|
76
276
|
});
|
|
77
|
-
|
|
277
|
+
nodesListToExport = yield space_service_1.spaceService.getParentSpaces(nodesListToExport);
|
|
278
|
+
yield this.exportToZip(nodesListToExport, versionsByNodeKey);
|
|
78
279
|
});
|
|
79
280
|
}
|
|
80
|
-
|
|
281
|
+
getNodesWithActiveVersion(nodes) {
|
|
81
282
|
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
-
const
|
|
283
|
+
const activeVersionsOfPackage = yield package_api_1.packageApi.findActiveVersionByIds(nodes.map(node => node.id));
|
|
83
284
|
nodes.forEach(node => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
285
|
+
node.version = activeVersionsOfPackage.find(packageVersion => packageVersion.id === node.id);
|
|
286
|
+
});
|
|
287
|
+
return nodes;
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
getPackagesWithDependencies(draftIdByNodeId, actionFlowPackageKeys) {
|
|
291
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
292
|
+
const allPackageDependencies = yield package_dependencies_api_1.packageDependenciesApi.findPackageDependenciesByIds(draftIdByNodeId);
|
|
293
|
+
Object.values(allPackageDependencies).forEach((value, key) => {
|
|
294
|
+
value = value.filter((dependency => actionFlowPackageKeys.includes(dependency.key)));
|
|
88
295
|
});
|
|
89
|
-
return
|
|
296
|
+
return allPackageDependencies;
|
|
90
297
|
});
|
|
91
298
|
}
|
|
92
|
-
|
|
299
|
+
getDependencyPackages(nodesToResolve, dependencyPackages, allPackages, actionFlowPackageKeys, resolvedDependencies, versionsByNodeKey) {
|
|
93
300
|
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
301
|
+
const draftIdByNodeId = new Map();
|
|
302
|
+
nodesToResolve.forEach(node => draftIdByNodeId.set(node.activatedDraftId, node.id));
|
|
303
|
+
const dependenciesByPackageDraftIds = yield this.getPackagesWithDependencies(draftIdByNodeId, actionFlowPackageKeys);
|
|
304
|
+
const nodesWithDependencies = nodesToResolve.map(nodeToExport => {
|
|
305
|
+
var _a;
|
|
306
|
+
nodeToExport.dependencies = (_a = dependenciesByPackageDraftIds[nodeToExport.activatedDraftId]) !== null && _a !== void 0 ? _a : [];
|
|
307
|
+
return nodeToExport;
|
|
308
|
+
});
|
|
309
|
+
for (const node of nodesWithDependencies) {
|
|
310
|
+
node.dependencies = node.dependencies.filter(dependency => !(dependency.external || dependency.deleted));
|
|
311
|
+
node.dependencies.forEach(dependency => {
|
|
312
|
+
var _a;
|
|
313
|
+
const dependencyVersions = (_a = versionsByNodeKey.get(dependency.key)) !== null && _a !== void 0 ? _a : [];
|
|
314
|
+
if (!dependencyVersions.includes(dependency.version)) {
|
|
315
|
+
dependencyVersions.push(dependency.version);
|
|
316
|
+
versionsByNodeKey.set(dependency.key, dependencyVersions);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
const nodesToGetKeys = node.dependencies.filter(dependency => {
|
|
320
|
+
return !this.nodeHasBeenResolvedBefore(resolvedDependencies, dependency.key, dependency.version);
|
|
321
|
+
}).map(iteratedNode => iteratedNode.key);
|
|
322
|
+
if (nodesToGetKeys.length > 0) {
|
|
323
|
+
const dependencyPackagesOfNode = allPackages.filter(packageNode => nodesToGetKeys.includes(packageNode.key)).map(dependency => {
|
|
324
|
+
const versionedDep = node.dependencies.find(dep => dependency.key === dep.key);
|
|
325
|
+
return Object.assign(Object.assign({}, dependency), { version: {
|
|
326
|
+
version: versionedDep.version
|
|
327
|
+
}, activatedDraftId: versionedDep.draftId });
|
|
328
|
+
});
|
|
329
|
+
dependencyPackages.push(...dependencyPackagesOfNode);
|
|
330
|
+
yield this.getDependencyPackages(dependencyPackagesOfNode, dependencyPackages, allPackages, actionFlowPackageKeys, resolvedDependencies, versionsByNodeKey);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return dependencyPackages;
|
|
100
334
|
});
|
|
101
335
|
}
|
|
336
|
+
nodeHasBeenResolvedBefore(nodePath, nodeKey, version) {
|
|
337
|
+
return nodePath.includes(nodeKey + ":" + version);
|
|
338
|
+
}
|
|
102
339
|
exportListOfPackages(nodes, fieldsToInclude) {
|
|
103
340
|
const filename = uuid_1.v4() + ".json";
|
|
104
341
|
file_service_1.fileService.writeToFileWithGivenName(JSON.stringify(nodes, fieldsToInclude), filename);
|
|
105
342
|
logger_1.logger.info(file_service_1.FileService.fileDownloadedMessage + filename);
|
|
106
343
|
}
|
|
344
|
+
exportPackagesAndAssets(nodes) {
|
|
345
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
346
|
+
const zips = [];
|
|
347
|
+
for (const rootPackage of nodes) {
|
|
348
|
+
const exportedPackage = yield package_api_1.packageApi.exportPackage(rootPackage.key, rootPackage.version.version);
|
|
349
|
+
zips.push({
|
|
350
|
+
data: exportedPackage,
|
|
351
|
+
packageKey: rootPackage.key,
|
|
352
|
+
version: rootPackage.version.version
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return zips;
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
exportToZip(nodes, versionsByNodeKey) {
|
|
359
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
360
|
+
const manifestNodes = this.exportManifestOfPackages(nodes, versionsByNodeKey);
|
|
361
|
+
const packageZips = yield this.exportPackagesAndAssets(nodes);
|
|
362
|
+
const zip = new AdmZip();
|
|
363
|
+
zip.addFile("manifest.yml", Buffer.from(YAML.stringify(manifestNodes), "utf8"));
|
|
364
|
+
for (const packageZip of packageZips) {
|
|
365
|
+
zip.addFile(`${packageZip.packageKey}_${packageZip.version}.zip`, packageZip.data);
|
|
366
|
+
}
|
|
367
|
+
const fileName = "export_" + uuid_1.v4() + ".zip";
|
|
368
|
+
zip.writeZip(fileName);
|
|
369
|
+
logger_1.logger.info(this.fileDownloadedMessage + fileName);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
exportManifestOfPackages(nodes, dependencyVersionsByNodeKey) {
|
|
373
|
+
const manifestNodesByPackageKey = new Map();
|
|
374
|
+
nodes.forEach((node) => {
|
|
375
|
+
var _a, _b, _c, _d;
|
|
376
|
+
const manifestNode = (_a = manifestNodesByPackageKey.get(node.key)) !== null && _a !== void 0 ? _a : {};
|
|
377
|
+
manifestNode.packageKey = node.key;
|
|
378
|
+
manifestNode.packageId = node.id;
|
|
379
|
+
manifestNode.space = {
|
|
380
|
+
spaceName: node.space.name,
|
|
381
|
+
spaceIcon: node.space.iconReference
|
|
382
|
+
};
|
|
383
|
+
manifestNode.variables = (_b = node.variables) === null || _b === void 0 ? void 0 : _b.map((variable) => {
|
|
384
|
+
var _a;
|
|
385
|
+
if (variable.type === "DATA_MODEL") {
|
|
386
|
+
// @ts-ignore
|
|
387
|
+
const dataModel = (_a = node.datamodels) === null || _a === void 0 ? void 0 : _a.find(dataModel => dataModel.node.dataModelId === variable.value);
|
|
388
|
+
return {
|
|
389
|
+
key: variable.key,
|
|
390
|
+
type: variable.type,
|
|
391
|
+
value: variable.value,
|
|
392
|
+
dataModelName: dataModel === null || dataModel === void 0 ? void 0 : dataModel.node.name,
|
|
393
|
+
dataPoolName: dataModel === null || dataModel === void 0 ? void 0 : dataModel.dataPool.name
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
return variable;
|
|
397
|
+
});
|
|
398
|
+
manifestNode.dependenciesByVersion = (_c = manifestNode.dependenciesByVersion) !== null && _c !== void 0 ? _c : new Map();
|
|
399
|
+
manifestNode.dependenciesByVersion.set(node.version.version, (_d = node.dependencies) !== null && _d !== void 0 ? _d : []);
|
|
400
|
+
manifestNodesByPackageKey.set(node.key, manifestNode);
|
|
401
|
+
});
|
|
402
|
+
return [...manifestNodesByPackageKey.values()];
|
|
403
|
+
}
|
|
107
404
|
}
|
|
108
405
|
exports.packageService = new PackageService();
|
|
109
406
|
});
|