@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.
Files changed (34) hide show
  1. package/api/compute-pool-api.js +2 -3
  2. package/api/node-api.js +7 -0
  3. package/api/package-api.js +55 -0
  4. package/api/package-dependencies-api.js +29 -0
  5. package/api/space-api.js +48 -0
  6. package/commands/package.command.js +11 -1
  7. package/content-cli-export.js +61 -0
  8. package/content-cli-import.js +61 -0
  9. package/content-cli.js +2 -0
  10. package/interfaces/manifest-transport.js +12 -0
  11. package/lib/api/node-api.d.ts +1 -0
  12. package/lib/api/package-api.d.ts +9 -1
  13. package/lib/api/package-dependencies-api.d.ts +4 -0
  14. package/lib/api/space-api.d.ts +9 -0
  15. package/lib/commands/package.command.d.ts +2 -0
  16. package/lib/content-cli-export.d.ts +4 -0
  17. package/lib/content-cli-import.d.ts +4 -0
  18. package/lib/interfaces/batch-export-node-transport.d.ts +10 -0
  19. package/lib/interfaces/manifest-transport.d.ts +27 -0
  20. package/lib/interfaces/package-manager.interfaces.d.ts +10 -0
  21. package/lib/interfaces/save-space.interface.d.ts +2 -1
  22. package/lib/services/file-service.d.ts +3 -0
  23. package/lib/services/http-client-service.v2.d.ts +8 -0
  24. package/lib/services/package-manager/datamodel-service.d.ts +2 -1
  25. package/lib/services/package-manager/package-service.d.ts +21 -4
  26. package/lib/services/package-manager/space-service.d.ts +11 -0
  27. package/lib/services/package-manager/variable-service.d.ts +3 -2
  28. package/package.json +1 -1
  29. package/services/file-service.js +9 -1
  30. package/services/http-client-service.v2.js +91 -3
  31. package/services/package-manager/datamodel-service.js +6 -8
  32. package/services/package-manager/package-service.js +331 -34
  33. package/services/package-manager/space-service.js +61 -0
  34. package/services/package-manager/variable-service.js +2 -7
@@ -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
- buildAuthorizationHeaders(profile) {
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 promises = [];
26
- nodesListToExport.forEach(node => {
27
- promises.push(new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
28
- node.datamodels = yield compute_pool_api_1.computePoolApi.findAssignedDatamodels(node.key);
29
- resolve(node);
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
- findAndExportAllPackages(includeDependencies) {
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
- //TODO need to replace all these individual calls with a single api call that gets all the required data.
51
- nodesListToExport = yield this.getVersionOfPackages(nodesListToExport);
52
- nodesListToExport = yield datamodel_service_1.dataModelService.getDatamodelsForNodes(nodesListToExport);
53
- const draftIdByNodeId = new Map();
54
- const nodeIds = nodesListToExport.map(node => {
55
- draftIdByNodeId.set(node.id, node.workingDraftId);
56
- return node.id;
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 dependenciesByPackageId = yield this.getPackagesDependenciesByPackageId(nodeIds, draftIdByNodeId);
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
- nodeToExport.dependencies = dependenciesByPackageId.get(nodeToExport.id);
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
- getPackagesDependenciesByPackageId(nodeIds, draftIdByNodeId) {
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 dependenciesByPackageId = new Map();
70
- const packageWithDependencies = yield this.getPackagesWithDependencies(nodeIds, draftIdByNodeId);
71
- packageWithDependencies.forEach(packageWithDependency => {
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
- const dependenciesOfPackage = (_a = dependenciesByPackageId.get(packageWithDependency.rootNodeId)) !== null && _a !== void 0 ? _a : [];
74
- dependenciesOfPackage.push(packageWithDependency);
75
- dependenciesByPackageId.set(packageWithDependency === null || packageWithDependency === void 0 ? void 0 : packageWithDependency.rootNodeId, dependenciesOfPackage);
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
- return dependenciesByPackageId;
277
+ nodesListToExport = yield space_service_1.spaceService.getParentSpaces(nodesListToExport);
278
+ yield this.exportToZip(nodesListToExport, versionsByNodeKey);
78
279
  });
79
280
  }
80
- getVersionOfPackages(nodes) {
281
+ getNodesWithActiveVersion(nodes) {
81
282
  return __awaiter(this, void 0, void 0, function* () {
82
- const promises = [];
283
+ const activeVersionsOfPackage = yield package_api_1.packageApi.findActiveVersionByIds(nodes.map(node => node.id));
83
284
  nodes.forEach(node => {
84
- promises.push(new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
85
- node.version = yield package_api_1.packageApi.findLatestVersionById(node.id);
86
- resolve(node);
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 Promise.all(promises);
296
+ return allPackageDependencies;
90
297
  });
91
298
  }
92
- getPackagesWithDependencies(nodeIds, draftIdByNodeId) {
299
+ getDependencyPackages(nodesToResolve, dependencyPackages, allPackages, actionFlowPackageKeys, resolvedDependencies, versionsByNodeKey) {
93
300
  return __awaiter(this, void 0, void 0, function* () {
94
- const promises = [];
95
- nodeIds.forEach((nodeId) => __awaiter(this, void 0, void 0, function* () { return promises.push(package_dependencies_api_1.packageDependenciesApi.findDependenciesOfPackage(nodeId, draftIdByNodeId.get(nodeId))); }));
96
- const results = yield Promise.all(promises);
97
- const dependencies = [];
98
- results.forEach(result => dependencies.push(...result));
99
- return dependencies;
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
  });