contensis-cli 1.0.11 → 1.0.12-beta.0
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/dist/mappers/DevInit-to-CIWorkflow.js +44 -25
- package/dist/mappers/DevInit-to-CIWorkflow.js.map +2 -2
- package/dist/services/ContensisAuthService.js +4 -0
- package/dist/services/ContensisAuthService.js.map +2 -2
- package/dist/services/ContensisCliService.js +4 -3
- package/dist/services/ContensisCliService.js.map +2 -2
- package/dist/services/ContensisDevService.js +39 -22
- package/dist/services/ContensisDevService.js.map +3 -3
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/mappers/DevInit-to-CIWorkflow.ts +51 -39
- package/src/services/ContensisAuthService.ts +5 -0
- package/src/services/ContensisCliService.ts +11 -3
- package/src/services/ContensisDevService.ts +52 -29
- package/src/version.ts +1 -1
|
@@ -32,9 +32,8 @@ var import_jsonpath_plus = require("jsonpath-plus");
|
|
|
32
32
|
var import_file_provider = require("../providers/file-provider");
|
|
33
33
|
var import_diff = require("../util/diff");
|
|
34
34
|
var import_logger = require("../util/logger");
|
|
35
|
-
var import_os = require("../util/os");
|
|
36
35
|
var import_yaml2 = require("../util/yaml");
|
|
37
|
-
const mapCIWorkflowContent = async (cli) => {
|
|
36
|
+
const mapCIWorkflowContent = async (cli, loc) => {
|
|
38
37
|
const workflowFile = (0, import_file_provider.readFile)(cli.git.ciFilePath);
|
|
39
38
|
if (!workflowFile)
|
|
40
39
|
return void 0;
|
|
@@ -44,7 +43,8 @@ const mapCIWorkflowContent = async (cli) => {
|
|
|
44
43
|
const newWorkflow = await mapGitHubActionCIWorkflowContent(
|
|
45
44
|
cli,
|
|
46
45
|
workflowDoc,
|
|
47
|
-
workflowJS
|
|
46
|
+
workflowJS,
|
|
47
|
+
loc
|
|
48
48
|
);
|
|
49
49
|
return {
|
|
50
50
|
existingWorkflow: workflowFile,
|
|
@@ -55,7 +55,8 @@ const mapCIWorkflowContent = async (cli) => {
|
|
|
55
55
|
const newWorkflow = await mapGitLabCIWorkflowContent(
|
|
56
56
|
cli,
|
|
57
57
|
workflowDoc,
|
|
58
|
-
workflowJS
|
|
58
|
+
workflowJS,
|
|
59
|
+
loc
|
|
59
60
|
);
|
|
60
61
|
return {
|
|
61
62
|
existingWorkflow: workflowFile,
|
|
@@ -80,17 +81,33 @@ const setWorkflowElement = (workflowDoc, path, value) => {
|
|
|
80
81
|
workflowDoc.addIn(findPath(path), value);
|
|
81
82
|
}
|
|
82
83
|
};
|
|
83
|
-
const mapGitLabCIWorkflowContent = async (cli, workflowDoc, workflowJS) => {
|
|
84
|
+
const mapGitLabCIWorkflowContent = async (cli, workflowDoc, workflowJS, loc) => {
|
|
85
|
+
var _a, _b;
|
|
84
86
|
const addGitLabJobStage = {
|
|
85
87
|
stage: "push-block",
|
|
86
88
|
variables: {
|
|
87
89
|
block_id: cli.blockId,
|
|
88
90
|
alias: cli.currentEnv,
|
|
89
91
|
project_id: cli.currentProject,
|
|
90
|
-
client_id:
|
|
91
|
-
shared_secret:
|
|
92
|
+
client_id: loc === "env" ? (_a = cli.devinit) == null ? void 0 : _a.credentials.clientId : "$CONTENSIS_CLIENT_ID",
|
|
93
|
+
shared_secret: loc === "env" ? (_b = cli.devinit) == null ? void 0 : _b.credentials.clientSecret : "$CONTENSIS_SHARED_SECRET"
|
|
92
94
|
}
|
|
93
95
|
};
|
|
96
|
+
if (loc === "git") {
|
|
97
|
+
workflowDoc.deleteIn(findPath(`variables.CONTENSIS_CLIENT_ID`));
|
|
98
|
+
workflowDoc.deleteIn(findPath(`variables.CONTENSIS_SHARED_SECRET`));
|
|
99
|
+
} else {
|
|
100
|
+
setWorkflowElement(
|
|
101
|
+
workflowDoc,
|
|
102
|
+
`variables.CONTENSIS_CLIENT_ID`,
|
|
103
|
+
`${cli.devinit.credentials.clientId}`
|
|
104
|
+
);
|
|
105
|
+
setWorkflowElement(
|
|
106
|
+
workflowDoc,
|
|
107
|
+
`variables.CONTENSIS_CLIENT_SECRET`,
|
|
108
|
+
`${cli.devinit.credentials.clientSecret}`
|
|
109
|
+
);
|
|
110
|
+
}
|
|
94
111
|
const addAppImageUri = async () => {
|
|
95
112
|
const appImageUri = await determineAppImageUri(
|
|
96
113
|
cli,
|
|
@@ -138,12 +155,12 @@ const mapGitLabCIWorkflowContent = async (cli, workflowDoc, workflowJS) => {
|
|
|
138
155
|
setWorkflowElement(
|
|
139
156
|
workflowDoc,
|
|
140
157
|
`${stepPath}.variables.client_id`,
|
|
141
|
-
|
|
158
|
+
"$CONTENSIS_CLIENT_ID"
|
|
142
159
|
);
|
|
143
160
|
setWorkflowElement(
|
|
144
161
|
workflowDoc,
|
|
145
162
|
`${stepPath}.variables.shared_secret`,
|
|
146
|
-
|
|
163
|
+
"$CONTENSIS_SHARED_SECRET"
|
|
147
164
|
);
|
|
148
165
|
} else {
|
|
149
166
|
await addAppImageUri();
|
|
@@ -161,12 +178,11 @@ const mapGitLabCIWorkflowContent = async (cli, workflowDoc, workflowJS) => {
|
|
|
161
178
|
cli.log.debug(`New file content to write
|
|
162
179
|
|
|
163
180
|
${workflowDoc}`);
|
|
164
|
-
const newWorkflow = (0
|
|
165
|
-
workflowDoc.toString({ lineWidth: 0 })
|
|
166
|
-
);
|
|
181
|
+
const newWorkflow = workflowDoc.toString({ lineWidth: 0 });
|
|
167
182
|
return newWorkflow;
|
|
168
183
|
};
|
|
169
|
-
const mapGitHubActionCIWorkflowContent = async (cli, workflowDoc, workflowJS) => {
|
|
184
|
+
const mapGitHubActionCIWorkflowContent = async (cli, workflowDoc, workflowJS, loc) => {
|
|
185
|
+
var _a, _b;
|
|
170
186
|
const addGitHubActionJobStep = {
|
|
171
187
|
name: "Push block to Contensis",
|
|
172
188
|
id: "push-block",
|
|
@@ -175,8 +191,8 @@ const mapGitHubActionCIWorkflowContent = async (cli, workflowDoc, workflowJS) =>
|
|
|
175
191
|
"block-id": cli.blockId,
|
|
176
192
|
alias: cli.currentEnv,
|
|
177
193
|
"project-id": cli.currentProject,
|
|
178
|
-
"client-id":
|
|
179
|
-
"shared-secret":
|
|
194
|
+
"client-id": loc === "env" ? "${{ env.CONTENSIS_CLIENT_ID }}" : "${{ secrets.CONTENSIS_CLIENT_ID }}",
|
|
195
|
+
"shared-secret": loc === "env" ? "${{ env.CONTENSIS_SHARED_SECRET }}" : "${{ secrets.CONTENSIS_SHARED_SECRET }}"
|
|
180
196
|
}
|
|
181
197
|
};
|
|
182
198
|
const addAppImageUri = async () => {
|
|
@@ -199,17 +215,20 @@ const mapGitHubActionCIWorkflowContent = async (cli, workflowDoc, workflowJS) =>
|
|
|
199
215
|
workflowJS,
|
|
200
216
|
"all"
|
|
201
217
|
);
|
|
202
|
-
if (
|
|
203
|
-
|
|
218
|
+
if (loc === "git") {
|
|
219
|
+
workflowDoc.deleteIn(findPath(`env.CONTENSIS_CLIENT_ID`));
|
|
220
|
+
workflowDoc.deleteIn(findPath(`env.CONTENSIS_SHARED_SECRET`));
|
|
221
|
+
} else {
|
|
204
222
|
setWorkflowElement(
|
|
205
223
|
workflowDoc,
|
|
206
|
-
`env.
|
|
207
|
-
cli.
|
|
224
|
+
`env.CONTENSIS_CLIENT_ID`,
|
|
225
|
+
(_a = cli.devinit) == null ? void 0 : _a.credentials.clientId
|
|
226
|
+
);
|
|
227
|
+
setWorkflowElement(
|
|
228
|
+
workflowDoc,
|
|
229
|
+
"env.CONTENSIS_SHARED_SECRET",
|
|
230
|
+
(_b = cli.devinit) == null ? void 0 : _b.credentials.clientSecret
|
|
208
231
|
);
|
|
209
|
-
}
|
|
210
|
-
if (cli.clientDetailsLocation === "git") {
|
|
211
|
-
workflowDoc.deleteIn(findPath(`env.CONTENSIS_CLIENT_ID`));
|
|
212
|
-
workflowDoc.deleteIn(findPath(`env.CONTENSIS_SHARED_SECRET`));
|
|
213
232
|
}
|
|
214
233
|
if (existingJobStep.length) {
|
|
215
234
|
const step = existingJobStep[0];
|
|
@@ -230,12 +249,12 @@ const mapGitHubActionCIWorkflowContent = async (cli, workflowDoc, workflowJS) =>
|
|
|
230
249
|
setWorkflowElement(
|
|
231
250
|
workflowDoc,
|
|
232
251
|
`${stepPath}.with.client-id`,
|
|
233
|
-
|
|
252
|
+
loc === "env" ? "${{ env.CONTENSIS_CLIENT_ID }}" : "${{ secrets.CONTENSIS_CLIENT_ID }}"
|
|
234
253
|
);
|
|
235
254
|
setWorkflowElement(
|
|
236
255
|
workflowDoc,
|
|
237
256
|
`${stepPath}.with.shared-secret`,
|
|
238
|
-
|
|
257
|
+
loc === "env" ? "${{ env.CONTENSIS_SHARED_SECRET }}" : "${{ secrets.CONTENSIS_SHARED_SECRET }}"
|
|
239
258
|
);
|
|
240
259
|
} else {
|
|
241
260
|
const existingBuildJobStep = findExistingJobSteps(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mappers/DevInit-to-CIWorkflow.ts"],
|
|
4
|
-
"sourcesContent": ["import inquirer from 'inquirer';\nimport { JSONPath, JSONPathOptions } from 'jsonpath-plus';\nimport { Document } from 'yaml';\nimport {\n GitHubActionPushBlockJob,\n GitHubActionPushBlockJobStep,\n GitLabPushBlockJobStage,\n} from '~/models/DevService';\nimport { readFile } from '~/providers/file-provider';\nimport ContensisDev from '~/services/ContensisDevService';\nimport { diffFileContent } from '~/util/diff';\nimport { logError } from '~/util/logger';\nimport { normaliseLineEndings } from '~/util/os';\nimport { parseYamlDocument, validateWorkflowYaml } from '~/util/yaml';\n\ntype MappedWorkflowOutput = {\n existingWorkflow: string;\n newWorkflow: string;\n diff: string;\n};\n\nexport const mapCIWorkflowContent = async (\n cli: ContensisDev\n): Promise<MappedWorkflowOutput | undefined> => {\n // get existing workflow file\n const workflowFile = readFile(cli.git.ciFilePath);\n if (!workflowFile) return undefined;\n\n // parse yaml to js\n const workflowDoc = parseYamlDocument(workflowFile);\n const workflowJS = workflowDoc.toJS();\n\n if (cli.git.type === 'github') {\n const newWorkflow = await mapGitHubActionCIWorkflowContent(\n cli,\n workflowDoc,\n workflowJS\n );\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n } else if (cli.git.type === 'gitlab') {\n const newWorkflow = await mapGitLabCIWorkflowContent(\n cli,\n workflowDoc,\n workflowJS\n );\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n }\n};\n\nconst findExistingJobSteps = (\n path: string,\n json: any,\n resultType: JSONPathOptions['resultType']\n) => {\n const existingJobStep = JSONPath({\n path,\n json,\n resultType: resultType,\n });\n\n return existingJobStep;\n};\n\nconst findPath = (path: string | any[]) =>\n typeof path === 'string' && path.includes('.')\n ? path.split('.').map(p => (Number(p) || Number(p) !== 0 ? p : Number(p)))\n : path;\n\nconst setWorkflowElement = (\n workflowDoc: Document,\n path: string | any[],\n value: any\n) => {\n if (workflowDoc.hasIn(findPath(path))) {\n workflowDoc.setIn(findPath(path), value);\n } else {\n workflowDoc.addIn(findPath(path), value);\n }\n};\n\nconst mapGitLabCIWorkflowContent = async (\n cli: ContensisDev,\n workflowDoc: Document,\n workflowJS: any\n) => {\n const addGitLabJobStage: GitLabPushBlockJobStage = {\n stage: 'push-block',\n variables: {\n block_id: cli.blockId,\n alias: cli.currentEnv,\n project_id: cli.currentProject,\n client_id:\n cli.clientDetailsLocation === 'env'\n ? cli.clientId\n : '$CONTENSIS_CLIENT_ID',\n shared_secret:\n cli.clientDetailsLocation === 'env'\n ? cli.clientSecret\n : '$CONTENSIS_SHARED_SECRET',\n },\n };\n\n const addAppImageUri = async () => {\n // Look in document level \"variables\"\n const appImageUri = await determineAppImageUri(\n cli,\n Object.entries(workflowJS.variables || {}),\n '$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/app:build-$CI_PIPELINE_IID'\n );\n\n if (appImageUri.addVar)\n setWorkflowElement(\n workflowDoc,\n `variables.${appImageUri.var}`,\n appImageUri.uri\n );\n\n if (appImageUri.var)\n addGitLabJobStage.variables['image_uri'] = `\\$${appImageUri.var}`;\n };\n\n // look for line in job\n // jobname[stage: push-block]\n const existingJobStep = findExistingJobSteps(\n '$..[?(@property === \"stage\" && @.match(/^push-block/i))]^',\n workflowJS,\n 'all'\n );\n\n // update job step\n if (existingJobStep.length) {\n // cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['job_name']\"\n // We want it to look like this \"job_name\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step:\n ${stepPath}\n stage: ${step.value.stage}\\n`\n );\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.alias`,\n cli.currentEnv\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.project_id`,\n cli.currentProject\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.block_id`,\n cli.blockId\n );\n\n // This is likely not needed when updating an existing push-block job step\n // we are assuming this is a forked/copied workflow with an already working image-uri reference\n // await addAppImageUri();\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.client_id`,\n cli.clientDetailsLocation === 'env'\n ? cli.clientId\n : '$CONTENSIS_CLIENT_ID'\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.shared_secret`,\n cli.clientDetailsLocation === 'env'\n ? cli.clientSecret\n : '$CONTENSIS_SHARED_SECRET'\n );\n } else {\n // create job with push step\n\n // Does a series of checks and prompts to determine the correct image-uri\n // for the app container build\n await addAppImageUri();\n\n // Add the new \"job\" to the Yaml Document\n workflowDoc.addIn(['stages'], 'push-block');\n workflowDoc.addIn([], {\n key: 'push-to-contensis',\n value: addGitLabJobStage,\n });\n setWorkflowElement(\n workflowDoc,\n `include`,\n 'https://gitlab.zengenti.com/ops/contensis-ci/-/raw/main/push-block.yml'\n );\n }\n\n cli.log.debug(`New file content to write\\n\\n${workflowDoc}`);\n\n const newWorkflow = normaliseLineEndings(\n workflowDoc.toString({ lineWidth: 0 })\n );\n\n return newWorkflow;\n};\n\nconst mapGitHubActionCIWorkflowContent = async (\n cli: ContensisDev,\n workflowDoc: Document,\n workflowJS: any\n) => {\n const addGitHubActionJobStep: GitHubActionPushBlockJobStep = {\n name: 'Push block to Contensis',\n id: 'push-block',\n uses: 'contensis/block-push@v1',\n with: {\n 'block-id': cli.blockId,\n // 'image-uri': '${{ steps.build.outputs.image-uri }}',\n alias: cli.currentEnv,\n 'project-id': cli.currentProject,\n 'client-id':\n cli.clientDetailsLocation === 'env'\n ? '${{ env.CONTENSIS_CLIENT_ID }}'\n : '${{ secrets.CONTENSIS_CLIENT_ID }}',\n 'shared-secret':\n cli.clientDetailsLocation === 'env'\n ? '${{ env.CONTENSIS_SHARED_SECRET }}'\n : '${{ secrets.CONTENSIS_SHARED_SECRET }}',\n },\n };\n\n const addAppImageUri = async () => {\n // Look in document level \"env\" vars\n const appImageUri = await determineAppImageUri(\n cli,\n Object.entries(workflowJS.env || {}),\n 'ghcr.io/${{ github.repository }}/${{ github.ref_name }}/app'\n );\n\n if (appImageUri.addVar)\n setWorkflowElement(\n workflowDoc,\n `env.${appImageUri.var}`,\n appImageUri.uri\n );\n // workflowDoc.addIn(['env'], { [appImageUri.var]: appImageUri.uri });\n\n if (appImageUri.var)\n addGitHubActionJobStep.with[\n 'image-uri'\n ] = `\\${{ env.${appImageUri.var} }}:build-\\${{ github.run_number }}`;\n };\n\n // look for line in job\n // jobs.x.steps[uses: contensis/block-push]\n const existingJobStep = findExistingJobSteps(\n '$.jobs..steps.*[?(@property === \"uses\" && @.match(/^contensis\\\\/block-push/i))]^',\n workflowJS,\n 'all'\n );\n\n // Update 'env' and store client id and secret\n if (cli.clientDetailsLocation === 'env') {\n setWorkflowElement(workflowDoc, `env.CONTENSIS_CLIENT_ID`, cli.clientId);\n setWorkflowElement(\n workflowDoc,\n `env.CONTENSIS_SHARED_SECRET`,\n cli.clientSecret\n );\n }\n\n if (cli.clientDetailsLocation === 'git') {\n // remove env vars from yml if we choose git\n workflowDoc.deleteIn(findPath(`env.CONTENSIS_CLIENT_ID`));\n workflowDoc.deleteIn(findPath(`env.CONTENSIS_SHARED_SECRET`));\n }\n\n // update job step\n if (existingJobStep.length) {\n //cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['jobs']['build']['steps'][3]\"\n // We want it to look like this \"jobs.build.steps.3\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step: ${stepPath}\n - name: ${step.value.name}\n id: ${step.value.id}\\n`\n );\n\n setWorkflowElement(workflowDoc, `${stepPath}.with.alias`, cli.currentEnv);\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.project-id`,\n cli.currentProject\n );\n setWorkflowElement(workflowDoc, `${stepPath}.with.block-id`, cli.blockId);\n\n // This is likely not needed when updating an existing push-block job step\n // we are assuming this is a forked/copied workflow with an already working image-uri reference\n // await addAppImageUri();\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.client-id`,\n cli.clientDetailsLocation === 'env'\n ? '${{ env.CONTENSIS_CLIENT_ID }}'\n : '${{ secrets.CONTENSIS_CLIENT_ID }}'\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.shared-secret`,\n cli.clientDetailsLocation === 'env'\n ? '${{ env.CONTENSIS_SHARED_SECRET }}'\n : '${{ secrets.CONTENSIS_SHARED_SECRET }}'\n );\n } else {\n // create job with push step\n\n // is there already a job with a property name containing \"build\"?\n const existingBuildJobStep = findExistingJobSteps(\n '$.jobs[?(@property.match(/build/i))]',\n workflowJS,\n 'all'\n ) as JSONPathOptions[]; // This isn't the correct type for this object\n\n let needs: string | undefined;\n // There are multiple jobs called *build*\n if (existingBuildJobStep.length > 1) {\n // prompt which build job we should depend on before pushing the block\n const choices = existingBuildJobStep.map(s => s.parentProperty);\n choices.push(new inquirer.Separator() as any);\n choices.push('none');\n if (choices.includes('build-app')) needs = 'build-app';\n else {\n ({ needs } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u231B',\n message: cli.messages.devinit.ciMultipleBuildJobChoices(),\n name: 'needs',\n choices,\n default: choices.find(\n s => typeof s === 'string' && s.includes('docker')\n ),\n },\n ]));\n }\n\n cli.log.raw('');\n } else if (existingBuildJobStep.length === 1)\n // Exactly one job step found containing a property name of *build*\n // we'll assume that is the one the push-block job depends on\n needs = existingBuildJobStep[0].parentProperty;\n\n if (existingBuildJobStep.length === 0 || needs === 'none') {\n // No existing build step found or chosen, offer all job steps in prompt\n const choices = Object.keys(workflowJS.jobs);\n choices.push(new inquirer.Separator() as any);\n choices.push('none');\n\n ({ needs } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u231B',\n message: cli.messages.devinit.ciMultipleJobChoices(),\n name: 'needs',\n choices,\n default: choices.find(\n j => typeof j === 'string' && j.includes('docker')\n ),\n },\n ]));\n if (needs === 'none') needs = undefined;\n cli.log.raw('');\n }\n\n // Does a series of checks and prompts to determine the correct image-uri\n // for the app container build\n await addAppImageUri();\n\n const newJob: GitHubActionPushBlockJob = {\n name: 'Push block to Contensis',\n 'runs-on': 'ubuntu-latest',\n needs,\n steps: [addGitHubActionJobStep],\n };\n\n // Add the new \"job\" to the Yaml Document\n workflowDoc.addIn(['jobs'], {\n key: 'deploy',\n value: newJob,\n });\n }\n\n // Workflow validation provided by @action-validator/core package\n const workflowIsValid = validateWorkflowYaml(workflowDoc.toString());\n\n // We could expand validation to check for having a build step to wait for\n // or if a valid image-uri attribute is set\n if (workflowIsValid === true) {\n cli.log.success(`GitHub workflow YAML is valid`);\n cli.log.debug(`New file content to write\\n\\n${workflowDoc}`);\n } else if (Array.isArray(workflowIsValid)) {\n // Errors\n logError(\n [\n ...workflowIsValid.map(\n res => new Error(`${res.code}: ${res.detail || res.title}`)\n ),\n workflowDoc.toString(),\n ],\n `GitHub workflow YAML did not pass validation check`\n );\n }\n\n // const newWorkflow = normaliseLineEndings(\n // workflowDoc.toString({ lineWidth: 0 })\n // );\n\n const newWorkflow = workflowDoc.toString({ lineWidth: 0 });\n\n return newWorkflow;\n};\n\nconst determineAppImageUri = async (\n cli: ContensisDev,\n vars: [string, string][],\n defaultUri: string\n) => {\n // Determine container image-uri via variables and/or prompts\n\n // Find vars including the word \"image\"\n const imageVars = vars.filter(([varname]) =>\n varname.toLowerCase().includes('image')\n );\n // Find vars named \"image\" that include the word \"app\"\n const appImageVars = imageVars.filter(\n ([varname, value]) =>\n !varname.toLowerCase().includes('builder_') &&\n (varname.toLowerCase().includes('app_') ||\n varname.toLowerCase().includes('build_') ||\n value?.toLowerCase().includes('/app'))\n );\n\n const appImageUriGuess = appImageVars?.[0];\n\n let appImageUri: string | undefined;\n let appImageVar: string | undefined;\n\n if (appImageUriGuess) {\n cli.log.success(\n `Found variable ${cli.log.standardText(\n appImageUriGuess[0]\n )} we'll use for pulling the block image from: ${cli.log.infoText(\n appImageUriGuess[1]\n )}`\n );\n appImageVar = appImageUriGuess[0];\n } else {\n // Could not find a suitable var to use for block image-uri\n // prompt for an app image uri\n const choices = vars.map(v => v[0]);\n const enterOwnMsg = 'enter my own / use default';\n\n choices.push(new inquirer.Separator() as any);\n choices.push(enterOwnMsg);\n choices.push(defaultUri);\n\n ({ appImageVar, appImageUri } = await inquirer.prompt([\n // First question determines if an existing env variable\n // already containes the tagged app image uri\n {\n type: 'list',\n prefix: '\uD83D\uDC33',\n message: cli.messages.devinit.ciMultipleAppImageVarChoices(),\n name: 'appImageVar',\n choices,\n default: choices.find(\n v => typeof v === 'string' && v.toLowerCase().includes('image')\n ),\n },\n // Subsequent prompt allows input of an image-uri if needed\n {\n type: 'input',\n when(answers) {\n return [enterOwnMsg, defaultUri].includes(answers.appImageVar);\n },\n prefix: `\\n \\n\uD83D\uDD17`,\n message: cli.messages.devinit.ciEnterOwnAppImagePrompt(cli.git),\n name: 'appImageUri',\n default: defaultUri,\n },\n ]));\n cli.log.raw('');\n\n // this indicates a uri has been added and we will add a new var\n // to the workflow to encourage users to update the docker tag part\n // of their build workflow to use the same var as the push-block job/step\n if ([enterOwnMsg, defaultUri].includes(appImageVar || ''))\n appImageVar = undefined;\n }\n\n if (appImageVar)\n appImageUri =\n cli.git.type === 'github'\n ? `\\${{ env.${appImageVar} }}`\n : `\\$${appImageVar}`;\n\n // TODO: prompt further for image tag\n\n return {\n addVar: !appImageVar,\n uri: appImageUri,\n var: appImageVar || 'BUILD_IMAGE',\n };\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAqB;AACrB,2BAA0C;AAO1C,2BAAyB;AAEzB,kBAAgC;AAChC,oBAAyB;
|
|
4
|
+
"sourcesContent": ["import inquirer from 'inquirer';\nimport { JSONPath, JSONPathOptions } from 'jsonpath-plus';\nimport { Document } from 'yaml';\nimport {\n GitHubActionPushBlockJob,\n GitHubActionPushBlockJobStep,\n GitLabPushBlockJobStage,\n} from '~/models/DevService';\nimport { readFile } from '~/providers/file-provider';\nimport ContensisDev from '~/services/ContensisDevService';\nimport { diffFileContent } from '~/util/diff';\nimport { logError } from '~/util/logger';\nimport { normaliseLineEndings } from '~/util/os';\nimport { parseYamlDocument, validateWorkflowYaml } from '~/util/yaml';\n\ntype MappedWorkflowOutput = {\n existingWorkflow: string;\n newWorkflow: string;\n diff: string;\n};\n\nexport const mapCIWorkflowContent = async (\n cli: ContensisDev,\n loc: 'git' | 'env'\n): Promise<MappedWorkflowOutput | undefined> => {\n // get existing workflow file\n const workflowFile = readFile(cli.git.ciFilePath);\n if (!workflowFile) return undefined;\n\n // parse yaml to js\n const workflowDoc = parseYamlDocument(workflowFile);\n const workflowJS = workflowDoc.toJS();\n\n if (cli.git.type === 'github') {\n const newWorkflow = await mapGitHubActionCIWorkflowContent(\n cli,\n workflowDoc,\n workflowJS,\n loc\n );\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n } else if (cli.git.type === 'gitlab') {\n const newWorkflow = await mapGitLabCIWorkflowContent(\n cli,\n workflowDoc,\n workflowJS,\n loc\n );\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n }\n};\n\nconst findExistingJobSteps = (\n path: string,\n json: any,\n resultType: JSONPathOptions['resultType']\n) => {\n const existingJobStep = JSONPath({\n path,\n json,\n resultType: resultType,\n });\n\n return existingJobStep;\n};\n\nconst findPath = (path: string | any[]) =>\n typeof path === 'string' && path.includes('.')\n ? path.split('.').map(p => (Number(p) || Number(p) !== 0 ? p : Number(p)))\n : path;\n\nconst setWorkflowElement = (\n workflowDoc: Document,\n path: string | any[],\n value: any\n) => {\n if (workflowDoc.hasIn(findPath(path))) {\n workflowDoc.setIn(findPath(path), value);\n } else {\n workflowDoc.addIn(findPath(path), value);\n }\n};\n\nconst mapGitLabCIWorkflowContent = async (\n cli: ContensisDev,\n workflowDoc: Document,\n workflowJS: any,\n loc: 'env' | 'git'\n) => {\n const addGitLabJobStage: GitLabPushBlockJobStage = {\n stage: 'push-block',\n variables: {\n block_id: cli.blockId,\n alias: cli.currentEnv,\n project_id: cli.currentProject,\n client_id:\n loc === 'env'\n ? cli.devinit?.credentials.clientId\n : '$CONTENSIS_CLIENT_ID',\n shared_secret:\n loc === 'env'\n ? cli.devinit?.credentials.clientSecret\n : '$CONTENSIS_SHARED_SECRET',\n },\n };\n\n if (loc === 'git') {\n // remove env vars from yml if we choose git\n workflowDoc.deleteIn(findPath(`variables.CONTENSIS_CLIENT_ID`));\n workflowDoc.deleteIn(findPath(`variables.CONTENSIS_SHARED_SECRET`));\n } else {\n setWorkflowElement(\n workflowDoc,\n `variables.CONTENSIS_CLIENT_ID`,\n `${cli.devinit.credentials.clientId}`\n );\n setWorkflowElement(\n workflowDoc,\n `variables.CONTENSIS_CLIENT_SECRET`,\n `${cli.devinit.credentials.clientSecret}`\n );\n }\n\n const addAppImageUri = async () => {\n // Look in document level \"variables\"\n const appImageUri = await determineAppImageUri(\n cli,\n Object.entries(workflowJS.variables || {}),\n '$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/app:build-$CI_PIPELINE_IID'\n );\n\n if (appImageUri.addVar)\n setWorkflowElement(\n workflowDoc,\n `variables.${appImageUri.var}`,\n appImageUri.uri\n );\n\n if (appImageUri.var)\n addGitLabJobStage.variables['image_uri'] = `\\$${appImageUri.var}`;\n };\n\n // look for line in job\n // jobname[stage: push-block]\n const existingJobStep = findExistingJobSteps(\n '$..[?(@property === \"stage\" && @.match(/^push-block/i))]^',\n workflowJS,\n 'all'\n );\n\n // update job step\n if (existingJobStep.length) {\n // cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['job_name']\"\n // We want it to look like this \"job_name\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step:\n ${stepPath}\n stage: ${step.value.stage}\\n`\n );\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.alias`,\n cli.currentEnv\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.project_id`,\n cli.currentProject\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.block_id`,\n cli.blockId\n );\n\n // This is likely not needed when updating an existing push-block job step\n // we are assuming this is a forked/copied workflow with an already working image-uri reference\n // await addAppImageUri();\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.client_id`,\n '$CONTENSIS_CLIENT_ID'\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.shared_secret`,\n '$CONTENSIS_SHARED_SECRET'\n );\n } else {\n // create job with push step\n\n // Does a series of checks and prompts to determine the correct image-uri\n // for the app container build\n await addAppImageUri();\n\n // Add the new \"job\" to the Yaml Document\n workflowDoc.addIn(['stages'], 'push-block');\n workflowDoc.addIn([], {\n key: 'push-to-contensis',\n value: addGitLabJobStage,\n });\n setWorkflowElement(\n workflowDoc,\n `include`,\n 'https://gitlab.zengenti.com/ops/contensis-ci/-/raw/main/push-block.yml'\n );\n }\n\n cli.log.debug(`New file content to write\\n\\n${workflowDoc}`);\n\n const newWorkflow = workflowDoc.toString({ lineWidth: 0 });\n return newWorkflow;\n};\n\nconst mapGitHubActionCIWorkflowContent = async (\n cli: ContensisDev,\n workflowDoc: Document,\n workflowJS: any,\n loc: 'git' | 'env'\n) => {\n const addGitHubActionJobStep: GitHubActionPushBlockJobStep = {\n name: 'Push block to Contensis',\n id: 'push-block',\n uses: 'contensis/block-push@v1',\n with: {\n 'block-id': cli.blockId,\n // 'image-uri': '${{ steps.build.outputs.image-uri }}',\n alias: cli.currentEnv,\n 'project-id': cli.currentProject,\n 'client-id':\n loc === 'env'\n ? '${{ env.CONTENSIS_CLIENT_ID }}'\n : '${{ secrets.CONTENSIS_CLIENT_ID }}',\n 'shared-secret':\n loc === 'env'\n ? '${{ env.CONTENSIS_SHARED_SECRET }}'\n : '${{ secrets.CONTENSIS_SHARED_SECRET }}',\n },\n };\n\n const addAppImageUri = async () => {\n // Look in document level \"env\" vars\n const appImageUri = await determineAppImageUri(\n cli,\n Object.entries(workflowJS.env || {}),\n 'ghcr.io/${{ github.repository }}/${{ github.ref_name }}/app'\n );\n\n if (appImageUri.addVar)\n setWorkflowElement(\n workflowDoc,\n `env.${appImageUri.var}`,\n appImageUri.uri\n );\n // workflowDoc.addIn(['env'], { [appImageUri.var]: appImageUri.uri });\n\n if (appImageUri.var)\n addGitHubActionJobStep.with[\n 'image-uri'\n ] = `\\${{ env.${appImageUri.var} }}:build-\\${{ github.run_number }}`;\n };\n\n // look for line in job\n // jobs.x.steps[uses: contensis/block-push]\n const existingJobStep = findExistingJobSteps(\n '$.jobs..steps.*[?(@property === \"uses\" && @.match(/^contensis\\\\/block-push/i))]^',\n workflowJS,\n 'all'\n );\n\n if (loc === 'git') {\n // remove env vars from yml if we choose git\n workflowDoc.deleteIn(findPath(`env.CONTENSIS_CLIENT_ID`));\n workflowDoc.deleteIn(findPath(`env.CONTENSIS_SHARED_SECRET`));\n } else {\n // update 'env' and store client id and secret\n setWorkflowElement(\n workflowDoc,\n `env.CONTENSIS_CLIENT_ID`,\n cli.devinit?.credentials.clientId\n );\n setWorkflowElement(\n workflowDoc,\n 'env.CONTENSIS_SHARED_SECRET',\n cli.devinit?.credentials.clientSecret\n );\n }\n\n // update job step\n if (existingJobStep.length) {\n //cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['jobs']['build']['steps'][3]\"\n // We want it to look like this \"jobs.build.steps.3\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step: ${stepPath}\n - name: ${step.value.name}\n id: ${step.value.id}\\n`\n );\n\n setWorkflowElement(workflowDoc, `${stepPath}.with.alias`, cli.currentEnv);\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.project-id`,\n cli.currentProject\n );\n setWorkflowElement(workflowDoc, `${stepPath}.with.block-id`, cli.blockId);\n\n // This is likely not needed when updating an existing push-block job step\n // we are assuming this is a forked/copied workflow with an already working image-uri reference\n // await addAppImageUri();\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.client-id`,\n loc === 'env'\n ? '${{ env.CONTENSIS_CLIENT_ID }}'\n : '${{ secrets.CONTENSIS_CLIENT_ID }}'\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.shared-secret`,\n loc === 'env'\n ? '${{ env.CONTENSIS_SHARED_SECRET }}'\n : '${{ secrets.CONTENSIS_SHARED_SECRET }}'\n );\n } else {\n // create job with push step\n\n // is there already a job with a property name containing \"build\"?\n const existingBuildJobStep = findExistingJobSteps(\n '$.jobs[?(@property.match(/build/i))]',\n workflowJS,\n 'all'\n ) as JSONPathOptions[]; // This isn't the correct type for this object\n\n let needs: string | undefined;\n // There are multiple jobs called *build*\n if (existingBuildJobStep.length > 1) {\n // prompt which build job we should depend on before pushing the block\n const choices = existingBuildJobStep.map(s => s.parentProperty);\n choices.push(new inquirer.Separator() as any);\n choices.push('none');\n if (choices.includes('build-app')) needs = 'build-app';\n else {\n ({ needs } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u231B',\n message: cli.messages.devinit.ciMultipleBuildJobChoices(),\n name: 'needs',\n choices,\n default: choices.find(\n s => typeof s === 'string' && s.includes('docker')\n ),\n },\n ]));\n }\n\n cli.log.raw('');\n } else if (existingBuildJobStep.length === 1)\n // Exactly one job step found containing a property name of *build*\n // we'll assume that is the one the push-block job depends on\n needs = existingBuildJobStep[0].parentProperty;\n\n if (existingBuildJobStep.length === 0 || needs === 'none') {\n // No existing build step found or chosen, offer all job steps in prompt\n const choices = Object.keys(workflowJS.jobs);\n choices.push(new inquirer.Separator() as any);\n choices.push('none');\n\n ({ needs } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u231B',\n message: cli.messages.devinit.ciMultipleJobChoices(),\n name: 'needs',\n choices,\n default: choices.find(\n j => typeof j === 'string' && j.includes('docker')\n ),\n },\n ]));\n if (needs === 'none') needs = undefined;\n cli.log.raw('');\n }\n\n // Does a series of checks and prompts to determine the correct image-uri\n // for the app container build\n await addAppImageUri();\n\n const newJob: GitHubActionPushBlockJob = {\n name: 'Push block to Contensis',\n 'runs-on': 'ubuntu-latest',\n needs,\n steps: [addGitHubActionJobStep],\n };\n\n // Add the new \"job\" to the Yaml Document\n workflowDoc.addIn(['jobs'], {\n key: 'deploy',\n value: newJob,\n });\n }\n\n // Workflow validation provided by @action-validator/core package\n const workflowIsValid = validateWorkflowYaml(workflowDoc.toString());\n\n // We could expand validation to check for having a build step to wait for\n // or if a valid image-uri attribute is set\n if (workflowIsValid === true) {\n cli.log.success(`GitHub workflow YAML is valid`);\n cli.log.debug(`New file content to write\\n\\n${workflowDoc}`);\n } else if (Array.isArray(workflowIsValid)) {\n // Errors\n logError(\n [\n ...workflowIsValid.map(\n res => new Error(`${res.code}: ${res.detail || res.title}`)\n ),\n workflowDoc.toString(),\n ],\n `GitHub workflow YAML did not pass validation check`\n );\n }\n\n const newWorkflow = workflowDoc.toString({ lineWidth: 0 });\n return newWorkflow;\n};\n\nconst determineAppImageUri = async (\n cli: ContensisDev,\n vars: [string, string][],\n defaultUri: string\n) => {\n // Determine container image-uri via variables and/or prompts\n\n // Find vars including the word \"image\"\n const imageVars = vars.filter(([varname]) =>\n varname.toLowerCase().includes('image')\n );\n // Find vars named \"image\" that include the word \"app\"\n const appImageVars = imageVars.filter(\n ([varname, value]) =>\n !varname.toLowerCase().includes('builder_') &&\n (varname.toLowerCase().includes('app_') ||\n varname.toLowerCase().includes('build_') ||\n value?.toLowerCase().includes('/app'))\n );\n\n const appImageUriGuess = appImageVars?.[0];\n\n let appImageUri: string | undefined;\n let appImageVar: string | undefined;\n\n if (appImageUriGuess) {\n cli.log.success(\n `Found variable ${cli.log.standardText(\n appImageUriGuess[0]\n )} we'll use for pulling the block image from: ${cli.log.infoText(\n appImageUriGuess[1]\n )}`\n );\n appImageVar = appImageUriGuess[0];\n } else {\n // Could not find a suitable var to use for block image-uri\n // prompt for an app image uri\n const choices = vars.map(v => v[0]);\n const enterOwnMsg = 'enter my own / use default';\n\n choices.push(new inquirer.Separator() as any);\n choices.push(enterOwnMsg);\n choices.push(defaultUri);\n\n ({ appImageVar, appImageUri } = await inquirer.prompt([\n // First question determines if an existing env variable\n // already containes the tagged app image uri\n {\n type: 'list',\n prefix: '\uD83D\uDC33',\n message: cli.messages.devinit.ciMultipleAppImageVarChoices(),\n name: 'appImageVar',\n choices,\n default: choices.find(\n v => typeof v === 'string' && v.toLowerCase().includes('image')\n ),\n },\n // Subsequent prompt allows input of an image-uri if needed\n {\n type: 'input',\n when(answers) {\n return [enterOwnMsg, defaultUri].includes(answers.appImageVar);\n },\n prefix: `\\n \\n\uD83D\uDD17`,\n message: cli.messages.devinit.ciEnterOwnAppImagePrompt(cli.git),\n name: 'appImageUri',\n default: defaultUri,\n },\n ]));\n cli.log.raw('');\n\n // this indicates a uri has been added and we will add a new var\n // to the workflow to encourage users to update the docker tag part\n // of their build workflow to use the same var as the push-block job/step\n if ([enterOwnMsg, defaultUri].includes(appImageVar || ''))\n appImageVar = undefined;\n }\n\n if (appImageVar)\n appImageUri =\n cli.git.type === 'github'\n ? `\\${{ env.${appImageVar} }}`\n : `\\$${appImageVar}`;\n\n // TODO: prompt further for image tag\n\n return {\n addVar: !appImageVar,\n uri: appImageUri,\n var: appImageVar || 'BUILD_IMAGE',\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_yaml", "inquirer"]
|
|
7
7
|
}
|
|
@@ -64,6 +64,10 @@ class ContensisAuthService {
|
|
|
64
64
|
rootUrl
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
+
ClassicToken = async () => {
|
|
68
|
+
await this.client.ensureBearerToken();
|
|
69
|
+
return this.client.contensisClassicToken;
|
|
70
|
+
};
|
|
67
71
|
BearerToken = async () => this.client.bearerToken || await this.client.ensureBearerToken();
|
|
68
72
|
RefreshToken = async () => !this.client.isRefreshTokenExpired() ? this.client.refreshToken : null;
|
|
69
73
|
ProjectId = () => this.client.clientConfig.projectId;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/ContensisAuthService.ts"],
|
|
4
|
-
"sourcesContent": ["import { NodejsClient } from 'contensis-management-api/lib/client';\nimport { ClientGrants, ClientGrantType } from 'contensis-core-api';\n\nclass ContensisAuthService {\n private client: NodejsClient;\n\n constructor({\n clientId = '',\n clientSecret = '',\n username,\n password,\n refreshToken,\n projectId,\n rootUrl,\n }: {\n clientId?: string;\n clientSecret?: string;\n username?: string;\n password?: string;\n refreshToken?: string;\n projectId: string;\n rootUrl: string;\n }) {\n let credentials: {\n clientType: ClientGrantType;\n clientDetails: ClientGrants;\n };\n if (username && password) {\n credentials = {\n clientType: 'contensis_classic',\n clientDetails: {\n username,\n password,\n },\n };\n } else if (refreshToken) {\n credentials = {\n clientType: 'contensis_classic_refresh_token',\n clientDetails: {\n refreshToken,\n },\n };\n } else {\n credentials = {\n clientType: 'client_credentials',\n clientDetails: {\n clientId,\n clientSecret,\n },\n };\n }\n\n this.client = NodejsClient.create({\n ...credentials,\n projectId,\n rootUrl,\n });\n }\n\n BearerToken = async () =>\n this.client.bearerToken || (await this.client.ensureBearerToken());\n RefreshToken = async () =>\n !this.client.isRefreshTokenExpired() ? this.client.refreshToken : null;\n\n /* PROJECTS */\n ProjectId = () => this.client.clientConfig.projectId;\n RootUrl = () => this.client.clientConfig.rootUrl;\n}\n\nexport default ContensisAuthService;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA6B;AAG7B,MAAM,qBAAqB;AAAA,EACjB;AAAA,EAER,YAAY;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAQG;AACD,QAAI;AAIJ,QAAI,YAAY,UAAU;AACxB,oBAAc;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,UACb;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,cAAc;AACvB,oBAAc;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,oBAAc;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,UACb;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,SAAS,2BAAa,OAAO;AAAA,MAChC,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,YACZ,KAAK,OAAO,eAAgB,MAAM,KAAK,OAAO,kBAAkB;AAAA,EAClE,eAAe,YACb,CAAC,KAAK,OAAO,sBAAsB,IAAI,KAAK,OAAO,eAAe;AAAA,EAGpE,YAAY,MAAM,KAAK,OAAO,aAAa;AAAA,EAC3C,UAAU,MAAM,KAAK,OAAO,aAAa;AAC3C;AAEA,IAAO,+BAAQ;",
|
|
4
|
+
"sourcesContent": ["import { NodejsClient } from 'contensis-management-api/lib/client';\nimport { ClientGrants, ClientGrantType } from 'contensis-core-api';\n\nclass ContensisAuthService {\n private client: NodejsClient;\n\n constructor({\n clientId = '',\n clientSecret = '',\n username,\n password,\n refreshToken,\n projectId,\n rootUrl,\n }: {\n clientId?: string;\n clientSecret?: string;\n username?: string;\n password?: string;\n refreshToken?: string;\n projectId: string;\n rootUrl: string;\n }) {\n let credentials: {\n clientType: ClientGrantType;\n clientDetails: ClientGrants;\n };\n if (username && password) {\n credentials = {\n clientType: 'contensis_classic',\n clientDetails: {\n username,\n password,\n },\n };\n } else if (refreshToken) {\n credentials = {\n clientType: 'contensis_classic_refresh_token',\n clientDetails: {\n refreshToken,\n },\n };\n } else {\n credentials = {\n clientType: 'client_credentials',\n clientDetails: {\n clientId,\n clientSecret,\n },\n };\n }\n\n this.client = NodejsClient.create({\n ...credentials,\n projectId,\n rootUrl,\n });\n }\n\n ClassicToken = async () => {\n // make sure our token isn't expried.\n await this.client.ensureBearerToken();\n return (this.client as any).contensisClassicToken;\n };\n BearerToken = async () =>\n this.client.bearerToken || (await this.client.ensureBearerToken());\n RefreshToken = async () =>\n !this.client.isRefreshTokenExpired() ? this.client.refreshToken : null;\n\n /* PROJECTS */\n ProjectId = () => this.client.clientConfig.projectId;\n RootUrl = () => this.client.clientConfig.rootUrl;\n}\n\nexport default ContensisAuthService;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA6B;AAG7B,MAAM,qBAAqB;AAAA,EACjB;AAAA,EAER,YAAY;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAQG;AACD,QAAI;AAIJ,QAAI,YAAY,UAAU;AACxB,oBAAc;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,UACb;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,cAAc;AACvB,oBAAc;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,oBAAc;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,UACb;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,SAAS,2BAAa,OAAO;AAAA,MAChC,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,YAAY;AAEzB,UAAM,KAAK,OAAO,kBAAkB;AACpC,WAAQ,KAAK,OAAe;AAAA,EAC9B;AAAA,EACA,cAAc,YACZ,KAAK,OAAO,eAAgB,MAAM,KAAK,OAAO,kBAAkB;AAAA,EAClE,eAAe,YACb,CAAC,KAAK,OAAO,sBAAsB,IAAI,KAAK,OAAO,eAAe;AAAA,EAGpE,YAAY,MAAM,KAAK,OAAO,aAAa;AAAA,EAC3C,UAAU,MAAM,KAAK,OAAO,aAAa;AAC3C;AAEA,IAAO,+BAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -63,9 +63,7 @@ class ContensisCli {
|
|
|
63
63
|
contensis;
|
|
64
64
|
contensisOpts;
|
|
65
65
|
currentProject;
|
|
66
|
-
|
|
67
|
-
clientId;
|
|
68
|
-
clientSecret;
|
|
66
|
+
devinit;
|
|
69
67
|
sourceAlias;
|
|
70
68
|
targetEnv;
|
|
71
69
|
urls;
|
|
@@ -74,6 +72,9 @@ class ContensisCli {
|
|
|
74
72
|
verb;
|
|
75
73
|
noun;
|
|
76
74
|
thirdArg;
|
|
75
|
+
get invokedBy() {
|
|
76
|
+
return this.command.createdUserId;
|
|
77
|
+
}
|
|
77
78
|
get cache() {
|
|
78
79
|
return this.session.Get();
|
|
79
80
|
}
|