contensis-cli 1.0.0-beta.10 → 1.0.0-beta.100
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 +1146 -78
- package/cli.js +3 -0
- package/dist/commands/connect.js +3 -3
- package/dist/commands/connect.js.map +2 -2
- package/dist/commands/create.js +45 -10
- package/dist/commands/create.js.map +2 -2
- package/dist/commands/dev.js +71 -0
- package/dist/commands/dev.js.map +7 -0
- package/dist/commands/diff.js +57 -0
- package/dist/commands/diff.js.map +7 -0
- package/dist/commands/execute.js +103 -0
- package/dist/commands/execute.js.map +7 -0
- package/dist/commands/get.js +169 -32
- package/dist/commands/get.js.map +3 -3
- package/dist/commands/globalOptions.js +37 -12
- package/dist/commands/globalOptions.js.map +2 -2
- package/dist/commands/import.js +65 -12
- package/dist/commands/import.js.map +2 -2
- package/dist/commands/index.js +22 -2
- package/dist/commands/index.js.map +2 -2
- package/dist/commands/list.js +53 -10
- package/dist/commands/list.js.map +2 -2
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +2 -2
- package/dist/commands/push.js +17 -13
- package/dist/commands/push.js.map +2 -2
- package/dist/commands/remove.js +51 -8
- package/dist/commands/remove.js.map +2 -2
- package/dist/commands/set.js +139 -12
- package/dist/commands/set.js.map +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/localisation/en-GB.js +297 -49
- package/dist/localisation/en-GB.js.map +2 -2
- package/dist/mappers/ContensisCliService-to-RequestHanderSiteConfigYaml.js +56 -0
- package/dist/mappers/ContensisCliService-to-RequestHanderSiteConfigYaml.js.map +7 -0
- package/dist/mappers/DevInit-to-CIWorkflow.js +374 -0
- package/dist/mappers/DevInit-to-CIWorkflow.js.map +7 -0
- package/dist/mappers/DevInit-to-RolePermissions.js +56 -0
- package/dist/mappers/DevInit-to-RolePermissions.js.map +7 -0
- package/dist/mappers/DevRequests-to-RequestHanderSiteConfigYaml.js +56 -0
- package/dist/mappers/DevRequests-to-RequestHanderSiteConfigYaml.js.map +7 -0
- package/dist/models/CliService.d.js +17 -0
- package/dist/models/CliService.d.js.map +7 -0
- package/dist/models/DevService.d.js +17 -0
- package/dist/models/DevService.d.js.map +7 -0
- package/dist/providers/CredentialProvider.js +46 -14
- package/dist/providers/CredentialProvider.js.map +3 -3
- package/dist/providers/SessionCacheProvider.js +21 -1
- package/dist/providers/SessionCacheProvider.js.map +2 -2
- package/dist/providers/file-provider.js +12 -6
- package/dist/providers/file-provider.js.map +3 -3
- package/dist/services/ContensisCliService.js +1211 -420
- package/dist/services/ContensisCliService.js.map +3 -3
- package/dist/services/ContensisDevService.js +368 -0
- package/dist/services/ContensisDevService.js.map +7 -0
- package/dist/services/ContensisRoleService.js +114 -0
- package/dist/services/ContensisRoleService.js.map +7 -0
- package/dist/shell.js +58 -18
- package/dist/shell.js.map +3 -3
- package/dist/util/console.printer.js +171 -55
- package/dist/util/console.printer.js.map +2 -2
- package/dist/util/diff.js +116 -0
- package/dist/util/diff.js.map +7 -0
- package/dist/util/dotenv.js +57 -0
- package/dist/util/dotenv.js.map +7 -0
- package/dist/util/find.js +31 -0
- package/dist/util/find.js.map +7 -0
- package/dist/util/git.js +128 -0
- package/dist/util/git.js.map +7 -0
- package/dist/util/index.js +8 -2
- package/dist/util/index.js.map +3 -3
- package/dist/util/logger.js +90 -29
- package/dist/util/logger.js.map +3 -3
- package/dist/util/os.js +42 -0
- package/dist/util/os.js.map +7 -0
- package/dist/util/timers.js +49 -0
- package/dist/util/timers.js.map +7 -0
- package/dist/util/yaml.js +45 -0
- package/dist/util/yaml.js.map +7 -0
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/esbuild.config.js +3 -1
- package/package.json +14 -3
- package/src/commands/connect.ts +3 -2
- package/src/commands/create.ts +61 -8
- package/src/commands/dev.ts +69 -0
- package/src/commands/diff.ts +41 -0
- package/src/commands/execute.ts +117 -0
- package/src/commands/get.ts +242 -28
- package/src/commands/globalOptions.ts +42 -12
- package/src/commands/import.ts +83 -8
- package/src/commands/index.ts +22 -1
- package/src/commands/list.ts +85 -11
- package/src/commands/login.ts +2 -1
- package/src/commands/push.ts +18 -11
- package/src/commands/remove.ts +66 -4
- package/src/commands/set.ts +189 -9
- package/src/index.ts +1 -4
- package/src/localisation/en-GB.ts +428 -66
- package/src/mappers/ContensisCliService-to-RequestHanderSiteConfigYaml.ts +44 -0
- package/src/mappers/DevInit-to-CIWorkflow.ts +526 -0
- package/src/mappers/DevInit-to-RolePermissions.ts +32 -0
- package/src/mappers/DevRequests-to-RequestHanderSiteConfigYaml.ts +44 -0
- package/src/models/CliService.d.ts +36 -0
- package/src/models/DevService.d.ts +40 -0
- package/src/models/JsModules.d.ts +2 -0
- package/src/providers/CredentialProvider.ts +51 -18
- package/src/providers/SessionCacheProvider.ts +29 -2
- package/src/providers/file-provider.ts +17 -6
- package/src/services/ContensisCliService.ts +1532 -508
- package/src/services/ContensisDevService.ts +434 -0
- package/src/services/ContensisRoleService.ts +108 -0
- package/src/shell.ts +68 -18
- package/src/util/console.printer.ts +240 -78
- package/src/util/diff.ts +124 -0
- package/src/util/dotenv.ts +37 -0
- package/src/util/find.ts +8 -0
- package/src/util/git.ts +131 -0
- package/src/util/index.ts +16 -7
- package/src/util/logger.ts +145 -31
- package/src/util/os.ts +12 -0
- package/src/util/timers.ts +24 -0
- package/src/util/yaml.ts +13 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to2, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to2, key) && key !== except)
|
|
16
|
+
__defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to2;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var ContensisDevService_exports = {};
|
|
26
|
+
__export(ContensisDevService_exports, {
|
|
27
|
+
default: () => ContensisDevService_default,
|
|
28
|
+
devCommand: () => devCommand
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(ContensisDevService_exports);
|
|
31
|
+
var import_await_to_js = __toESM(require("await-to-js"));
|
|
32
|
+
var import_child_process = require("child_process");
|
|
33
|
+
var import_inquirer = __toESM(require("inquirer"));
|
|
34
|
+
var import_path = __toESM(require("path"));
|
|
35
|
+
var import_ContensisRoleService = __toESM(require("./ContensisRoleService"));
|
|
36
|
+
var import_DevRequests_to_RequestHanderSiteConfigYaml = require("../mappers/DevRequests-to-RequestHanderSiteConfigYaml");
|
|
37
|
+
var import_DevInit_to_CIWorkflow = require("../mappers/DevInit-to-CIWorkflow");
|
|
38
|
+
var import_DevInit_to_RolePermissions = require("../mappers/DevInit-to-RolePermissions");
|
|
39
|
+
var import_file_provider = require("../providers/file-provider");
|
|
40
|
+
var import_diff = require("../util/diff");
|
|
41
|
+
var import_dotenv = require("../util/dotenv");
|
|
42
|
+
var import_find = require("../util/find");
|
|
43
|
+
var import_git = require("../util/git");
|
|
44
|
+
var import_json = require("../util/json.formatter");
|
|
45
|
+
var import_os = require("../util/os");
|
|
46
|
+
var import_yaml = require("../util/yaml");
|
|
47
|
+
var import_nanospinner = require("nanospinner");
|
|
48
|
+
class ContensisDev extends import_ContensisRoleService.default {
|
|
49
|
+
git;
|
|
50
|
+
constructor(args, outputOpts, contensisOpts = {}) {
|
|
51
|
+
super(args, outputOpts, contensisOpts);
|
|
52
|
+
}
|
|
53
|
+
DevelopmentInit = async (projectHome, opts) => {
|
|
54
|
+
const { dryRun = false } = opts || {};
|
|
55
|
+
const { currentEnv, currentProject, log, messages } = this;
|
|
56
|
+
const contensis = await this.ConnectContensis();
|
|
57
|
+
if (contensis) {
|
|
58
|
+
const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();
|
|
59
|
+
if (keysErr) {
|
|
60
|
+
log.error(messages.keys.noList(currentEnv));
|
|
61
|
+
log.error((0, import_json.jsonFormatter)(keysErr));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const apiKeyExists = (findKey) => apiKeys == null ? void 0 : apiKeys.find(
|
|
65
|
+
(k) => k.name.trim().toLowerCase() === (findKey == null ? void 0 : findKey.trim().toLowerCase())
|
|
66
|
+
);
|
|
67
|
+
const git = this.git = new import_git.GitHelper(projectHome);
|
|
68
|
+
const workflowFiles = git.workflows;
|
|
69
|
+
let ciFileName = git.ciFileName;
|
|
70
|
+
const devKeyName = `${git.name} development`;
|
|
71
|
+
const devKeyDescription = `${git.name} [contensis-cli]`;
|
|
72
|
+
let existingDevKey = apiKeyExists(devKeyName);
|
|
73
|
+
const deployKeyName = `${git.name} deployment`;
|
|
74
|
+
const deployKeyDescription = `${git.name} deploy [contensis-cli]`;
|
|
75
|
+
let existingDeployKey = apiKeyExists(deployKeyName);
|
|
76
|
+
const blockId = git.name;
|
|
77
|
+
const errors = [];
|
|
78
|
+
log.raw("");
|
|
79
|
+
log.success(messages.devinit.intro());
|
|
80
|
+
log.raw("");
|
|
81
|
+
log.raw(
|
|
82
|
+
log.infoText(
|
|
83
|
+
messages.devinit.projectDetails(
|
|
84
|
+
git.name,
|
|
85
|
+
currentEnv,
|
|
86
|
+
currentProject,
|
|
87
|
+
git
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
log.raw(
|
|
92
|
+
log.infoText(
|
|
93
|
+
messages.devinit.developmentKey(devKeyName, !!existingDevKey)
|
|
94
|
+
)
|
|
95
|
+
);
|
|
96
|
+
log.raw(
|
|
97
|
+
log.infoText(
|
|
98
|
+
messages.devinit.deploymentKey(deployKeyName, !!existingDeployKey)
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
log.raw("");
|
|
102
|
+
if (Array.isArray(workflowFiles) && workflowFiles.length > 1) {
|
|
103
|
+
({ ciFileName } = await import_inquirer.default.prompt([
|
|
104
|
+
{
|
|
105
|
+
type: "list",
|
|
106
|
+
prefix: "\u29F0",
|
|
107
|
+
message: messages.devinit.ciMultipleChoices(),
|
|
108
|
+
name: "ciFileName",
|
|
109
|
+
choices: workflowFiles,
|
|
110
|
+
default: workflowFiles.find((f) => f.includes("docker"))
|
|
111
|
+
}
|
|
112
|
+
]));
|
|
113
|
+
log.raw("");
|
|
114
|
+
git.ciFileName = ciFileName;
|
|
115
|
+
}
|
|
116
|
+
log.raw(log.infoText(messages.devinit.ciDetails(ciFileName)));
|
|
117
|
+
let mappedWorkflow;
|
|
118
|
+
const { clientDetailsOption } = await import_inquirer.default.prompt({
|
|
119
|
+
name: "clientDetailsOption",
|
|
120
|
+
type: "list",
|
|
121
|
+
prefix: "\u{1F511}",
|
|
122
|
+
message: messages.devinit.clientDetailsLocation(),
|
|
123
|
+
choices: [
|
|
124
|
+
messages.devinit.clientDetailsInGit(git),
|
|
125
|
+
messages.devinit.clientDetailsInEnv()
|
|
126
|
+
]
|
|
127
|
+
});
|
|
128
|
+
if (clientDetailsOption === messages.devinit.clientDetailsInEnv()) {
|
|
129
|
+
this.clientDetailsLocation = "env";
|
|
130
|
+
} else {
|
|
131
|
+
this.clientDetailsLocation = "git";
|
|
132
|
+
}
|
|
133
|
+
if (this.clientDetailsLocation === "env") {
|
|
134
|
+
mappedWorkflow = await (0, import_DevInit_to_CIWorkflow.mapCIWorkflowContent)(this);
|
|
135
|
+
this.clientId = existingDeployKey == null ? void 0 : existingDeployKey.id;
|
|
136
|
+
this.clientSecret = existingDeployKey == null ? void 0 : existingDeployKey.sharedSecret;
|
|
137
|
+
log.help(messages.devinit.ciIntro(git, this.clientDetailsLocation));
|
|
138
|
+
} else {
|
|
139
|
+
mappedWorkflow = await (0, import_DevInit_to_CIWorkflow.mapCIWorkflowContent)(this);
|
|
140
|
+
log.help(messages.devinit.ciIntro(git, this.clientDetailsLocation));
|
|
141
|
+
}
|
|
142
|
+
if (!dryRun) {
|
|
143
|
+
const { confirm } = await import_inquirer.default.prompt([
|
|
144
|
+
{
|
|
145
|
+
type: "confirm",
|
|
146
|
+
message: messages.devinit.confirm(),
|
|
147
|
+
name: "confirm",
|
|
148
|
+
default: false
|
|
149
|
+
}
|
|
150
|
+
]);
|
|
151
|
+
log.raw("");
|
|
152
|
+
if (!confirm)
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
let accessToken = void 0;
|
|
156
|
+
const { canContinue } = await import_inquirer.default.prompt([
|
|
157
|
+
{
|
|
158
|
+
type: "confirm",
|
|
159
|
+
prefix: "\u{1F6E1}\uFE0F",
|
|
160
|
+
message: messages.devinit.accessTokenPrompt(),
|
|
161
|
+
name: "canContinue"
|
|
162
|
+
}
|
|
163
|
+
]);
|
|
164
|
+
log.raw("");
|
|
165
|
+
if (!canContinue)
|
|
166
|
+
return;
|
|
167
|
+
if (canContinue) {
|
|
168
|
+
const spinner = (0, import_nanospinner.createSpinner)(messages.devinit.accessTokenFetch());
|
|
169
|
+
spinner.start();
|
|
170
|
+
const token = await this.GetDeliveryApiKey();
|
|
171
|
+
if (token) {
|
|
172
|
+
spinner.success();
|
|
173
|
+
this.log.success(messages.devinit.accessTokenSuccess(token));
|
|
174
|
+
accessToken = token;
|
|
175
|
+
} else {
|
|
176
|
+
spinner.error();
|
|
177
|
+
this.log.error(messages.devinit.accessTokenFailed());
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const checkpoint = (op) => {
|
|
182
|
+
if (errors.length)
|
|
183
|
+
throw errors[0];
|
|
184
|
+
else
|
|
185
|
+
log.debug(`${op} completed ok`);
|
|
186
|
+
return true;
|
|
187
|
+
};
|
|
188
|
+
const [getRolesErr, roles] = await (0, import_await_to_js.default)(contensis.roles.GetRoles());
|
|
189
|
+
if (!roles && getRolesErr)
|
|
190
|
+
errors.push(getRolesErr);
|
|
191
|
+
checkpoint(`fetched ${roles == null ? void 0 : roles.length} roles`);
|
|
192
|
+
if (dryRun) {
|
|
193
|
+
checkpoint(`skip api key creation (dry-run)`);
|
|
194
|
+
} else {
|
|
195
|
+
existingDevKey = await this.CreateOrUpdateApiKey(
|
|
196
|
+
existingDevKey,
|
|
197
|
+
devKeyName,
|
|
198
|
+
devKeyDescription
|
|
199
|
+
);
|
|
200
|
+
checkpoint("dev key created");
|
|
201
|
+
existingDeployKey = await this.CreateOrUpdateApiKey(
|
|
202
|
+
existingDeployKey,
|
|
203
|
+
deployKeyName,
|
|
204
|
+
deployKeyDescription
|
|
205
|
+
);
|
|
206
|
+
checkpoint("deploy key created");
|
|
207
|
+
let existingDevRole = (0, import_find.findByIdOrName)(roles || [], devKeyName, true);
|
|
208
|
+
existingDevRole = await this.CreateOrUpdateRole(
|
|
209
|
+
existingDevRole,
|
|
210
|
+
(0, import_DevInit_to_RolePermissions.devKeyRole)(devKeyName, devKeyDescription)
|
|
211
|
+
);
|
|
212
|
+
checkpoint("dev key role assigned");
|
|
213
|
+
log.success(messages.devinit.createDevKey(devKeyName, true));
|
|
214
|
+
let existingDeployRole = (0, import_find.findByIdOrName)(
|
|
215
|
+
roles || [],
|
|
216
|
+
deployKeyName,
|
|
217
|
+
true
|
|
218
|
+
);
|
|
219
|
+
existingDeployRole = await this.CreateOrUpdateRole(
|
|
220
|
+
existingDeployRole,
|
|
221
|
+
(0, import_DevInit_to_RolePermissions.deployKeyRole)(deployKeyName, deployKeyDescription)
|
|
222
|
+
);
|
|
223
|
+
checkpoint("deploy key role assigned");
|
|
224
|
+
log.success(messages.devinit.createDeployKey(deployKeyName, true));
|
|
225
|
+
checkpoint("api keys done");
|
|
226
|
+
}
|
|
227
|
+
const envContentsToAdd = {
|
|
228
|
+
ALIAS: currentEnv,
|
|
229
|
+
PROJECT: currentProject
|
|
230
|
+
};
|
|
231
|
+
if (accessToken)
|
|
232
|
+
envContentsToAdd["ACCESS_TOKEN"] = accessToken;
|
|
233
|
+
if (this.clientDetailsLocation === "env") {
|
|
234
|
+
if (git.type === "github") {
|
|
235
|
+
envContentsToAdd["CONTENSIS_CLIENT_ID"] = this.clientId;
|
|
236
|
+
envContentsToAdd["CONTENSIS_CLIENT_SECRET"] = this.clientSecret;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const envFilePath = `${projectHome}/.env`;
|
|
240
|
+
const existingEnvFile = (0, import_file_provider.readFile)(envFilePath);
|
|
241
|
+
const envFileLines = (0, import_dotenv.mergeDotEnvFileContents)(
|
|
242
|
+
(existingEnvFile || "").split("\n").filter((l) => !!l),
|
|
243
|
+
envContentsToAdd
|
|
244
|
+
);
|
|
245
|
+
const newEnvFileContent = envFileLines.join("\n");
|
|
246
|
+
const envDiff = (0, import_diff.diffFileContent)(existingEnvFile || "", newEnvFileContent);
|
|
247
|
+
if (dryRun) {
|
|
248
|
+
if (envDiff) {
|
|
249
|
+
log.info(`Updating .env file ${(0, import_os.winSlash)(envFilePath)}:
|
|
250
|
+
${envDiff}`);
|
|
251
|
+
log.raw("");
|
|
252
|
+
}
|
|
253
|
+
checkpoint("skip .env file update (dry-run)");
|
|
254
|
+
} else {
|
|
255
|
+
if (envDiff)
|
|
256
|
+
log.info(`updating .env file ${(0, import_os.winSlash)(envFilePath)}`);
|
|
257
|
+
(0, import_file_provider.writeFile)(envFilePath, envFileLines.join("\n"));
|
|
258
|
+
checkpoint(".env file updated");
|
|
259
|
+
log.success(messages.devinit.writeEnvFile());
|
|
260
|
+
}
|
|
261
|
+
if (mappedWorkflow == null ? void 0 : mappedWorkflow.diff) {
|
|
262
|
+
log.info(
|
|
263
|
+
`Updating ${(0, import_os.winSlash)(ciFileName)} file:
|
|
264
|
+
${mappedWorkflow.diff}`
|
|
265
|
+
);
|
|
266
|
+
log.raw("");
|
|
267
|
+
}
|
|
268
|
+
if (dryRun) {
|
|
269
|
+
checkpoint("skip CI file update (dry-run)");
|
|
270
|
+
} else {
|
|
271
|
+
if (mappedWorkflow == null ? void 0 : mappedWorkflow.newWorkflow) {
|
|
272
|
+
if (mappedWorkflow == null ? void 0 : mappedWorkflow.diff) {
|
|
273
|
+
(0, import_file_provider.writeFile)(git.ciFilePath, mappedWorkflow.newWorkflow);
|
|
274
|
+
log.success(messages.devinit.writeCiFile(`./${ciFileName}`));
|
|
275
|
+
log.info(
|
|
276
|
+
messages.devinit.ciBlockTip(blockId, currentEnv, currentProject)
|
|
277
|
+
);
|
|
278
|
+
} else {
|
|
279
|
+
log.info(messages.devinit.ciFileNoChanges(`./${ciFileName}`));
|
|
280
|
+
}
|
|
281
|
+
checkpoint("CI file updated");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (this.clientDetailsLocation === "git") {
|
|
285
|
+
log.warning(messages.devinit.addGitSecretsIntro());
|
|
286
|
+
log.help(
|
|
287
|
+
messages.devinit.addGitSecretsHelp(
|
|
288
|
+
git,
|
|
289
|
+
existingDeployKey == null ? void 0 : existingDeployKey.id,
|
|
290
|
+
existingDeployKey == null ? void 0 : existingDeployKey.sharedSecret
|
|
291
|
+
)
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
if (dryRun) {
|
|
295
|
+
log.success(messages.devinit.dryRun());
|
|
296
|
+
log.help(messages.devinit.noChanges());
|
|
297
|
+
} else {
|
|
298
|
+
log.success(messages.devinit.success());
|
|
299
|
+
log.help(messages.devinit.startProjectTip());
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
ExecRequestHandler = async (blockIds, overrideArgs) => {
|
|
304
|
+
var _a, _b;
|
|
305
|
+
const { log } = this;
|
|
306
|
+
const exeHome = import_path.default.join(import_file_provider.appRootDir, "reqhan");
|
|
307
|
+
const exe = "Zengenti.Contensis.RequestHandler.LocalDevelopment";
|
|
308
|
+
const exePath = import_path.default.join(exeHome, exe);
|
|
309
|
+
const siteConfigPath = import_path.default.join(import_file_provider.appRootDir, "site_config.yaml");
|
|
310
|
+
const siteConfig = await (0, import_DevRequests_to_RequestHanderSiteConfigYaml.mapSiteConfigYaml)(this);
|
|
311
|
+
(0, import_file_provider.writeFile)("site_config.yaml", (0, import_yaml.stringifyYaml)(siteConfig));
|
|
312
|
+
const args = overrideArgs ? typeof (overrideArgs == null ? void 0 : overrideArgs[0]) === "string" && overrideArgs[0].includes(" ", 2) ? overrideArgs[0].split(" ") : overrideArgs : [];
|
|
313
|
+
if (!args.find((a) => a === "-c"))
|
|
314
|
+
args.push("-c", siteConfigPath);
|
|
315
|
+
const child = (0, import_child_process.spawn)(exePath, args, { stdio: "inherit" });
|
|
316
|
+
log.info(`Launching request handler...`);
|
|
317
|
+
if (overrideArgs == null ? void 0 : overrideArgs.length)
|
|
318
|
+
this.log.warning(
|
|
319
|
+
`Spawning process with supplied args: ${JSON.stringify(
|
|
320
|
+
child.spawnargs,
|
|
321
|
+
null,
|
|
322
|
+
2
|
|
323
|
+
)}`
|
|
324
|
+
);
|
|
325
|
+
let isRunning = false;
|
|
326
|
+
(_a = child == null ? void 0 : child.stdout) == null ? void 0 : _a.on("data", (data) => {
|
|
327
|
+
isRunning = true;
|
|
328
|
+
log.raw(data);
|
|
329
|
+
});
|
|
330
|
+
(_b = child == null ? void 0 : child.stderr) == null ? void 0 : _b.on("data", (data) => {
|
|
331
|
+
log.error(data);
|
|
332
|
+
});
|
|
333
|
+
child.on("spawn", () => {
|
|
334
|
+
isRunning = true;
|
|
335
|
+
log.help(
|
|
336
|
+
`You may see a firewall popup requesting network access, it is safe to approve`
|
|
337
|
+
);
|
|
338
|
+
});
|
|
339
|
+
child.on("exit", (code) => {
|
|
340
|
+
isRunning = false;
|
|
341
|
+
log[code === 0 ? "success" : "warning"](
|
|
342
|
+
`Request handler exited with code ${code}
|
|
343
|
+
`
|
|
344
|
+
);
|
|
345
|
+
});
|
|
346
|
+
child.on("error", (error) => {
|
|
347
|
+
isRunning = false;
|
|
348
|
+
log.error(`Could not launch request handler due to error
|
|
349
|
+
${error}`);
|
|
350
|
+
});
|
|
351
|
+
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
352
|
+
while (true) {
|
|
353
|
+
if (!isRunning) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
const devCommand = (commandArgs, outputOpts, contensisOpts = {}) => {
|
|
361
|
+
return new ContensisDev(["", "", ...commandArgs], outputOpts, contensisOpts);
|
|
362
|
+
};
|
|
363
|
+
var ContensisDevService_default = ContensisDev;
|
|
364
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
365
|
+
0 && (module.exports = {
|
|
366
|
+
devCommand
|
|
367
|
+
});
|
|
368
|
+
//# sourceMappingURL=ContensisDevService.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/ContensisDevService.ts"],
|
|
4
|
+
"sourcesContent": ["import to from 'await-to-js';\nimport { spawn } from 'child_process';\nimport inquirer from 'inquirer';\nimport path from 'path';\n\nimport { Role } from 'contensis-management-api/lib/models';\nimport { MigrateRequest } from 'migratortron';\n\nimport ContensisRole from './ContensisRoleService';\nimport { OutputOptionsConstructorArg } from '~/models/CliService';\nimport { EnvContentsToAdd } from '~/models/DevService';\nimport { mapSiteConfigYaml } from '~/mappers/DevRequests-to-RequestHanderSiteConfigYaml';\nimport { mapCIWorkflowContent } from '~/mappers/DevInit-to-CIWorkflow';\nimport {\n deployKeyRole,\n devKeyRole,\n} from '~/mappers/DevInit-to-RolePermissions';\nimport { appRootDir, readFile, writeFile } from '~/providers/file-provider';\nimport { diffFileContent } from '~/util/diff';\nimport { mergeDotEnvFileContents } from '~/util/dotenv';\nimport { findByIdOrName } from '~/util/find';\nimport { GitHelper } from '~/util/git';\nimport { jsonFormatter } from '~/util/json.formatter';\nimport { winSlash } from '~/util/os';\nimport { stringifyYaml } from '~/util/yaml';\nimport { createSpinner } from 'nanospinner';\n\nclass ContensisDev extends ContensisRole {\n git!: GitHelper;\n\n constructor(\n args: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n super(args, outputOpts, contensisOpts);\n }\n\n DevelopmentInit = async (projectHome: string, opts: any) => {\n const { dryRun = false } = opts || {};\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();\n if (keysErr) {\n log.error(messages.keys.noList(currentEnv));\n log.error(jsonFormatter(keysErr));\n return;\n }\n const apiKeyExists = (findKey: string) =>\n apiKeys?.find(\n k => k.name.trim().toLowerCase() === findKey?.trim().toLowerCase()\n );\n\n // Retrieve git info\n const git = (this.git = new GitHelper(projectHome));\n\n // Retrieve ci workflow info\n const workflowFiles = git.workflows;\n\n // Set variables for performing operations and logging etc.\n let ciFileName = git.ciFileName;\n\n const devKeyName = `${git.name} development`;\n const devKeyDescription = `${git.name} [contensis-cli]`;\n let existingDevKey = apiKeyExists(devKeyName);\n\n const deployKeyName = `${git.name} deployment`;\n const deployKeyDescription = `${git.name} deploy [contensis-cli]`;\n\n let existingDeployKey = apiKeyExists(deployKeyName);\n\n const blockId = git.name;\n const errors = [] as AppError[];\n\n // Start render console output\n log.raw('');\n log.success(messages.devinit.intro());\n log.raw('');\n log.raw(\n log.infoText(\n messages.devinit.projectDetails(\n git.name,\n currentEnv,\n currentProject,\n git\n )\n )\n );\n log.raw(\n log.infoText(\n messages.devinit.developmentKey(devKeyName, !!existingDevKey)\n )\n );\n log.raw(\n log.infoText(\n messages.devinit.deploymentKey(deployKeyName, !!existingDeployKey)\n )\n );\n log.raw('');\n\n if (Array.isArray(workflowFiles) && workflowFiles.length > 1) {\n // Choose GitHub workflow file (if multiple)\n ({ ciFileName } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u29F0',\n message: messages.devinit.ciMultipleChoices(),\n name: 'ciFileName',\n choices: workflowFiles,\n default: workflowFiles.find(f => f.includes('docker')),\n },\n ]));\n log.raw('');\n git.ciFileName = ciFileName;\n }\n\n log.raw(log.infoText(messages.devinit.ciDetails(ciFileName)));\n\n let mappedWorkflow;\n // Location for Client ID / Secret.\n const { clientDetailsOption } = await inquirer.prompt({\n name: 'clientDetailsOption',\n type: 'list',\n prefix: '\uD83D\uDD11',\n // Where would you like to store your Client ID/Secret?\n message: messages.devinit.clientDetailsLocation(),\n choices: [\n messages.devinit.clientDetailsInGit(git),\n messages.devinit.clientDetailsInEnv(),\n ],\n });\n\n // global 'clientDetailsLocation' variable stores users input on where client id / secert are stored\n if (clientDetailsOption === messages.devinit.clientDetailsInEnv()) {\n this.clientDetailsLocation = 'env';\n } else {\n this.clientDetailsLocation = 'git';\n }\n\n if (this.clientDetailsLocation === 'env') {\n // Update CI Workflow to pull from ENV variables\n mappedWorkflow = await mapCIWorkflowContent(this);\n // Add client id and secret to global 'this'\n this.clientId = existingDeployKey?.id;\n this.clientSecret = existingDeployKey?.sharedSecret;\n log.help(messages.devinit.ciIntro(git, this.clientDetailsLocation));\n } else {\n // Look at the workflow file content and make updates\n mappedWorkflow = await mapCIWorkflowContent(this);\n log.help(messages.devinit.ciIntro(git, this.clientDetailsLocation));\n }\n\n if (!dryRun) {\n // Confirm prompt\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n message: messages.devinit.confirm(),\n name: 'confirm',\n default: false,\n },\n ]);\n log.raw('');\n if (!confirm) return;\n }\n\n // Access token prompt\n let accessToken: string | undefined = undefined;\n const { canContinue } = await inquirer.prompt([\n {\n type: 'confirm',\n prefix: '\uD83D\uDEE1\uFE0F',\n // We're all set to grab your access token. Can we proceed? (\u23CE continue)\n message: messages.devinit.accessTokenPrompt(),\n name: 'canContinue',\n },\n ]);\n log.raw('');\n\n if (!canContinue) return;\n if (canContinue) {\n const spinner = createSpinner(messages.devinit.accessTokenFetch());\n spinner.start();\n\n // Fetching access token\n const token = await this.GetDeliveryApiKey();\n\n if (token) {\n spinner.success();\n this.log.success(messages.devinit.accessTokenSuccess(token));\n accessToken = token;\n } else {\n spinner.error();\n this.log.error(messages.devinit.accessTokenFailed());\n return;\n }\n }\n\n // Magic happens...\n const checkpoint = (op: string) => {\n if (errors.length) throw errors[0];\n else log.debug(`${op} completed ok`);\n return true;\n };\n\n // Arrange API keys for development and deployment\n const [getRolesErr, roles] = await to(contensis.roles.GetRoles());\n if (!roles && getRolesErr) errors.push(getRolesErr);\n checkpoint(`fetched ${roles?.length} roles`);\n if (dryRun) {\n checkpoint(`skip api key creation (dry-run)`);\n } else {\n existingDevKey = await this.CreateOrUpdateApiKey(\n existingDevKey,\n devKeyName,\n devKeyDescription\n );\n checkpoint('dev key created');\n\n existingDeployKey = await this.CreateOrUpdateApiKey(\n existingDeployKey,\n deployKeyName,\n deployKeyDescription\n );\n checkpoint('deploy key created');\n\n // Ensure dev API key is assigned to a role\n let existingDevRole = findByIdOrName(roles || [], devKeyName, true) as\n | Role\n | undefined;\n existingDevRole = await this.CreateOrUpdateRole(\n existingDevRole,\n devKeyRole(devKeyName, devKeyDescription)\n );\n checkpoint('dev key role assigned');\n log.success(messages.devinit.createDevKey(devKeyName, true));\n\n // Ensure deploy API key is assigned to a role with the right permissions\n let existingDeployRole = findByIdOrName(\n roles || [],\n deployKeyName,\n true\n ) as Role | undefined;\n existingDeployRole = await this.CreateOrUpdateRole(\n existingDeployRole,\n deployKeyRole(deployKeyName, deployKeyDescription)\n );\n\n checkpoint('deploy key role assigned');\n log.success(messages.devinit.createDeployKey(deployKeyName, true));\n checkpoint('api keys done');\n }\n\n // Update or create a file called .env in project home\n const envContentsToAdd: EnvContentsToAdd = {\n ALIAS: currentEnv,\n PROJECT: currentProject,\n };\n if (accessToken) envContentsToAdd['ACCESS_TOKEN'] = accessToken;\n if (this.clientDetailsLocation === 'env') {\n if (git.type === 'github') {\n envContentsToAdd['CONTENSIS_CLIENT_ID'] = this.clientId;\n envContentsToAdd['CONTENSIS_CLIENT_SECRET'] = this.clientSecret;\n }\n }\n\n const envFilePath = `${projectHome}/.env`;\n const existingEnvFile = readFile(envFilePath);\n const envFileLines = mergeDotEnvFileContents(\n (existingEnvFile || '').split('\\n').filter(l => !!l),\n envContentsToAdd\n );\n const newEnvFileContent = envFileLines.join('\\n');\n const envDiff = diffFileContent(existingEnvFile || '', newEnvFileContent);\n\n if (dryRun) {\n if (envDiff) {\n log.info(`Updating .env file ${winSlash(envFilePath)}:\\n${envDiff}`);\n log.raw('');\n }\n checkpoint('skip .env file update (dry-run)');\n } else {\n if (envDiff) log.info(`updating .env file ${winSlash(envFilePath)}`);\n writeFile(envFilePath, envFileLines.join('\\n'));\n checkpoint('.env file updated');\n log.success(messages.devinit.writeEnvFile());\n // log.help(messages.devinit.useEnvFileTip());\n }\n\n // Update CI file -- different for GH/GL\n if (mappedWorkflow?.diff) {\n log.info(\n `Updating ${winSlash(ciFileName)} file:\\n${mappedWorkflow.diff}`\n );\n log.raw('');\n }\n if (dryRun) {\n checkpoint('skip CI file update (dry-run)');\n //log.object(ciFileLines);\n } else {\n if (mappedWorkflow?.newWorkflow) {\n if (mappedWorkflow?.diff) {\n writeFile(git.ciFilePath, mappedWorkflow.newWorkflow);\n log.success(messages.devinit.writeCiFile(`./${ciFileName}`));\n log.info(\n messages.devinit.ciBlockTip(blockId, currentEnv, currentProject)\n );\n } else {\n log.info(messages.devinit.ciFileNoChanges(`./${ciFileName}`));\n }\n checkpoint('CI file updated');\n }\n }\n\n if (this.clientDetailsLocation === 'git') {\n // Echo Deployment API key to console, ask user to add secrets to repo\n log.warning(messages.devinit.addGitSecretsIntro());\n log.help(\n messages.devinit.addGitSecretsHelp(\n git,\n existingDeployKey?.id,\n existingDeployKey?.sharedSecret\n )\n );\n }\n\n if (dryRun) {\n log.success(messages.devinit.dryRun());\n log.help(messages.devinit.noChanges());\n } else {\n log.success(messages.devinit.success());\n log.help(messages.devinit.startProjectTip());\n }\n }\n };\n\n ExecRequestHandler = async (blockIds: string[], overrideArgs?: string[]) => {\n // if no request handler exe\n // download it.\n\n // if update arg, redownload it\n\n const { log } = this;\n // const getPrefixOld = log.getPrefix;\n const exeHome = path.join(appRootDir, 'reqhan');\n const exe = 'Zengenti.Contensis.RequestHandler.LocalDevelopment';\n const exePath = path.join(exeHome, exe);\n const siteConfigPath = path.join(appRootDir, 'site_config.yaml');\n\n const siteConfig = await mapSiteConfigYaml(this);\n writeFile('site_config.yaml', stringifyYaml(siteConfig));\n\n const args = overrideArgs\n ? typeof overrideArgs?.[0] === 'string' &&\n overrideArgs[0].includes(' ', 2)\n ? overrideArgs[0].split(' ')\n : overrideArgs\n : []; // args could be [ '-c .\\\\site_config.yaml' ] or [ '-c', '.\\\\site_config.yaml' ]\n\n // Add required args\n if (!args.find(a => a === '-c')) args.push('-c', siteConfigPath);\n\n // const child = execFile(exePath, args);\n\n const child = spawn(exePath, args, { stdio: 'inherit' });\n\n // log.raw('');\n log.info(`Launching request handler...`);\n if (overrideArgs?.length)\n this.log.warning(\n `Spawning process with supplied args: ${JSON.stringify(\n child.spawnargs,\n null,\n 2\n )}`\n );\n\n let isRunning = false;\n\n // Log child output through event listeners\n child?.stdout?.on('data', data => {\n isRunning = true;\n log.raw(data);\n });\n\n child?.stderr?.on('data', data => {\n log.error(data);\n });\n\n child.on('spawn', () => {\n isRunning = true;\n log.help(\n `You may see a firewall popup requesting network access, it is safe to approve`\n );\n // log.getPrefix = () => Logger.infoText(`[rqh]`);\n });\n\n child.on('exit', code => {\n isRunning = false;\n\n log[code === 0 ? 'success' : 'warning'](\n `Request handler exited with code ${code}\\n`\n );\n });\n\n child.on('error', error => {\n isRunning = false;\n log.error(`Could not launch request handler due to error \\n${error}`);\n });\n\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n // keep the method running until we can return\n while (true === true) {\n if (!isRunning) {\n // log.getPrefix = getPrefixOld; // restore logger state\n return;\n }\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n };\n}\nexport const devCommand = (\n commandArgs: string[],\n outputOpts: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n) => {\n return new ContensisDev(['', '', ...commandArgs], outputOpts, contensisOpts);\n};\n\nexport default ContensisDev;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ContensisRole", "inquirer", "to", "path"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to2, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to2, key) && key !== except)
|
|
16
|
+
__defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to2;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var ContensisRoleService_exports = {};
|
|
26
|
+
__export(ContensisRoleService_exports, {
|
|
27
|
+
default: () => ContensisRoleService_default
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(ContensisRoleService_exports);
|
|
30
|
+
var import_await_to_js = __toESM(require("await-to-js"));
|
|
31
|
+
var import_ContensisCliService = __toESM(require("./ContensisCliService"));
|
|
32
|
+
var import_logger = require("../util/logger");
|
|
33
|
+
class ContensisRole extends import_ContensisCliService.default {
|
|
34
|
+
constructor(args, outputOpts, contensisOpts = {}) {
|
|
35
|
+
super(args, outputOpts, contensisOpts);
|
|
36
|
+
}
|
|
37
|
+
GetDeliveryApiKey = async () => {
|
|
38
|
+
const { contensis, currentEnv } = this;
|
|
39
|
+
const CMS = `https://cms-${currentEnv}.cloud.contensis.com`;
|
|
40
|
+
const API = "api/contensis-cli/settings/defaultDeliveryApiAccessToken";
|
|
41
|
+
if (contensis) {
|
|
42
|
+
const [error, bearerToken] = await (0, import_await_to_js.default)(
|
|
43
|
+
contensis.content.sourceRepo.repo.BearerToken()
|
|
44
|
+
);
|
|
45
|
+
if (error)
|
|
46
|
+
import_logger.Logger.error(error.message);
|
|
47
|
+
const token = fetch(`${CMS}/${API}`, {
|
|
48
|
+
method: "GET",
|
|
49
|
+
headers: {
|
|
50
|
+
"Content-Type": "application/json",
|
|
51
|
+
Authorization: `Bearer ${bearerToken}`
|
|
52
|
+
}
|
|
53
|
+
}).then((repsonse) => repsonse.json()).then(({ value }) => {
|
|
54
|
+
if (value)
|
|
55
|
+
return value;
|
|
56
|
+
}).catch((error2) => {
|
|
57
|
+
throw new Error(error2);
|
|
58
|
+
});
|
|
59
|
+
return token;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
CreateOrUpdateApiKey = async (existingKey, name, description) => {
|
|
63
|
+
const { contensis, currentEnv, messages } = this;
|
|
64
|
+
if (!contensis)
|
|
65
|
+
throw new Error("shouldnt be here");
|
|
66
|
+
if (existingKey) {
|
|
67
|
+
const [err, key] = await contensis.apiKeys.UpdateKey(existingKey.id, {
|
|
68
|
+
name,
|
|
69
|
+
description
|
|
70
|
+
});
|
|
71
|
+
if (err)
|
|
72
|
+
throw new Error(messages.keys.failedUpdate(currentEnv, name), {
|
|
73
|
+
cause: err
|
|
74
|
+
});
|
|
75
|
+
return key;
|
|
76
|
+
} else {
|
|
77
|
+
const [err, key] = await contensis.apiKeys.CreateKey(name, description);
|
|
78
|
+
if (err)
|
|
79
|
+
throw new Error(messages.keys.failedCreate(currentEnv, name), {
|
|
80
|
+
cause: err
|
|
81
|
+
});
|
|
82
|
+
return key;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
CreateOrUpdateRole = async (existingRole, role) => {
|
|
86
|
+
const { contensis, currentEnv, messages } = this;
|
|
87
|
+
if (!contensis)
|
|
88
|
+
throw new Error("shouldnt be here");
|
|
89
|
+
if (existingRole) {
|
|
90
|
+
const [err, updated] = await contensis.roles.UpdateRole(existingRole.id, {
|
|
91
|
+
...existingRole,
|
|
92
|
+
...role
|
|
93
|
+
});
|
|
94
|
+
if (err)
|
|
95
|
+
throw new Error(messages.roles.failedSet(currentEnv, role.name), {
|
|
96
|
+
cause: err
|
|
97
|
+
});
|
|
98
|
+
return updated;
|
|
99
|
+
} else {
|
|
100
|
+
const [err, created] = await contensis.roles.CreateRole(
|
|
101
|
+
role
|
|
102
|
+
);
|
|
103
|
+
if (err)
|
|
104
|
+
throw new Error(messages.roles.failedCreate(currentEnv, role.name), {
|
|
105
|
+
cause: err
|
|
106
|
+
});
|
|
107
|
+
return created;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
var ContensisRoleService_default = ContensisRole;
|
|
112
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
113
|
+
0 && (module.exports = {});
|
|
114
|
+
//# sourceMappingURL=ContensisRoleService.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/ContensisRoleService.ts"],
|
|
4
|
+
"sourcesContent": ["import { Role } from 'contensis-management-api/lib/models';\nimport { ApiKey, MigrateRequest } from 'migratortron';\nimport to from 'await-to-js';\nimport ContensisCli from './ContensisCliService';\nimport { OutputOptionsConstructorArg } from '~/models/CliService';\nimport { Logger } from '~/util/logger';\n\nclass ContensisRole extends ContensisCli {\n constructor(\n args: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n super(args, outputOpts, contensisOpts);\n }\n\n GetDeliveryApiKey = async () => {\n const { contensis, currentEnv } = this;\n\n const CMS = `https://cms-${currentEnv}.cloud.contensis.com`;\n const API = 'api/contensis-cli/settings/defaultDeliveryApiAccessToken';\n\n if (contensis) {\n const [error, bearerToken] = await to(\n contensis.content.sourceRepo.repo.BearerToken()\n );\n if (error) Logger.error(error.message);\n\n const token = fetch(`${CMS}/${API}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${bearerToken}`,\n },\n })\n .then(repsonse => repsonse.json())\n .then(({ value }) => {\n if (value) return value;\n })\n .catch(error => {\n throw new Error(error);\n });\n\n return token;\n }\n };\n\n CreateOrUpdateApiKey = async (\n existingKey: ApiKey | undefined,\n name: string,\n description: string\n ) => {\n const { contensis, currentEnv, messages } = this;\n if (!contensis) throw new Error('shouldnt be here');\n if (existingKey) {\n const [err, key] = await contensis.apiKeys.UpdateKey(existingKey.id, {\n name,\n description,\n });\n\n if (err)\n throw new Error(messages.keys.failedUpdate(currentEnv, name), {\n cause: err,\n });\n return key;\n } else {\n const [err, key] = await contensis.apiKeys.CreateKey(name, description);\n if (err)\n throw new Error(messages.keys.failedCreate(currentEnv, name), {\n cause: err,\n });\n\n return key;\n }\n };\n\n CreateOrUpdateRole = async (\n existingRole: Role | undefined,\n role: Partial<Role>\n ) => {\n const { contensis, currentEnv, messages } = this;\n if (!contensis) throw new Error('shouldnt be here');\n\n if (existingRole) {\n // TODO: check is update needed?\n const [err, updated] = await contensis.roles.UpdateRole(existingRole.id, {\n ...existingRole,\n ...role,\n });\n if (err)\n throw new Error(messages.roles.failedSet(currentEnv, role.name), {\n cause: err,\n });\n return updated;\n } else {\n const [err, created] = await contensis.roles.CreateRole(\n role as Omit<Role, 'id'>\n );\n if (err)\n throw new Error(messages.roles.failedCreate(currentEnv, role.name), {\n cause: err,\n });\n\n return created;\n }\n };\n}\nexport default ContensisRole;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,yBAAe;AACf,iCAAyB;AAEzB,oBAAuB;AAEvB,MAAM,sBAAsB,2BAAAA,QAAa;AAAA,EACvC,YACE,MACA,YACA,gBAAyC,CAAC,GAC1C;AACA,UAAM,MAAM,YAAY,aAAa;AAAA,EACvC;AAAA,EAEA,oBAAoB,YAAY;AAC9B,UAAM,EAAE,WAAW,WAAW,IAAI;AAElC,UAAM,MAAM,eAAe;AAC3B,UAAM,MAAM;AAEZ,QAAI,WAAW;AACb,YAAM,CAAC,OAAO,WAAW,IAAI,UAAM,mBAAAC;AAAA,QACjC,UAAU,QAAQ,WAAW,KAAK,YAAY;AAAA,MAChD;AACA,UAAI;AAAO,6BAAO,MAAM,MAAM,OAAO;AAErC,YAAM,QAAQ,MAAM,GAAG,OAAO,OAAO;AAAA,QACnC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU;AAAA,QAC3B;AAAA,MACF,CAAC,EACE,KAAK,cAAY,SAAS,KAAK,CAAC,EAChC,KAAK,CAAC,EAAE,MAAM,MAAM;AACnB,YAAI;AAAO,iBAAO;AAAA,MACpB,CAAC,EACA,MAAM,CAAAC,WAAS;AACd,cAAM,IAAI,MAAMA,MAAK;AAAA,MACvB,CAAC;AAEH,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,uBAAuB,OACrB,aACA,MACA,gBACG;AACH,UAAM,EAAE,WAAW,YAAY,SAAS,IAAI;AAC5C,QAAI,CAAC;AAAW,YAAM,IAAI,MAAM,kBAAkB;AAClD,QAAI,aAAa;AACf,YAAM,CAAC,KAAK,GAAG,IAAI,MAAM,UAAU,QAAQ,UAAU,YAAY,IAAI;AAAA,QACnE;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI;AACF,cAAM,IAAI,MAAM,SAAS,KAAK,aAAa,YAAY,IAAI,GAAG;AAAA,UAC5D,OAAO;AAAA,QACT,CAAC;AACH,aAAO;AAAA,IACT,OAAO;AACL,YAAM,CAAC,KAAK,GAAG,IAAI,MAAM,UAAU,QAAQ,UAAU,MAAM,WAAW;AACtE,UAAI;AACF,cAAM,IAAI,MAAM,SAAS,KAAK,aAAa,YAAY,IAAI,GAAG;AAAA,UAC5D,OAAO;AAAA,QACT,CAAC;AAEH,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,qBAAqB,OACnB,cACA,SACG;AACH,UAAM,EAAE,WAAW,YAAY,SAAS,IAAI;AAC5C,QAAI,CAAC;AAAW,YAAM,IAAI,MAAM,kBAAkB;AAElD,QAAI,cAAc;AAEhB,YAAM,CAAC,KAAK,OAAO,IAAI,MAAM,UAAU,MAAM,WAAW,aAAa,IAAI;AAAA,QACvE,GAAG;AAAA,QACH,GAAG;AAAA,MACL,CAAC;AACD,UAAI;AACF,cAAM,IAAI,MAAM,SAAS,MAAM,UAAU,YAAY,KAAK,IAAI,GAAG;AAAA,UAC/D,OAAO;AAAA,QACT,CAAC;AACH,aAAO;AAAA,IACT,OAAO;AACL,YAAM,CAAC,KAAK,OAAO,IAAI,MAAM,UAAU,MAAM;AAAA,QAC3C;AAAA,MACF;AACA,UAAI;AACF,cAAM,IAAI,MAAM,SAAS,MAAM,aAAa,YAAY,KAAK,IAAI,GAAG;AAAA,UAClE,OAAO;AAAA,QACT,CAAC;AAEH,aAAO;AAAA,IACT;AAAA,EACF;AACF;AACA,IAAO,+BAAQ;",
|
|
6
|
+
"names": ["ContensisCli", "to", "error"]
|
|
7
|
+
}
|