eitri-cli 1.7.0-beta.4 → 1.7.0-beta.6

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/config/dev.js CHANGED
@@ -100,6 +100,17 @@ const config = {
100
100
  eitriManager: {
101
101
  url: `https://${HOST}/eitri-manager-api`,
102
102
  },
103
+ cdn: {
104
+ library: {
105
+ url: "https://cdn.83io.com.br/library",
106
+ bifrost: {
107
+ versions: "/eitri-bifrost/versions/index.json"
108
+ },
109
+ luminusUi: {
110
+ versions: "/luminus-ui/versions/index.json"
111
+ },
112
+ }
113
+ }
103
114
  };
104
115
 
105
116
  module.exports = config;
@@ -84,6 +84,17 @@ const config = {
84
84
  },
85
85
  managerFront: {
86
86
  url: `https://admin.k8s.eitri.calindra.com.br`
87
+ },
88
+ cdn: {
89
+ library: {
90
+ url: "https://cdn.83io.com.br/library",
91
+ bifrost: {
92
+ versions: "/eitri-bifrost/versions/index.json"
93
+ },
94
+ luminusUi: {
95
+ versions: "/luminus-ui/versions/index.json"
96
+ },
97
+ }
87
98
  }
88
99
  }
89
100
 
@@ -102,6 +102,17 @@ const config = {
102
102
  my: "/workspace/my",
103
103
  check: "/workspace/check",
104
104
  },
105
+ cdn: {
106
+ library: {
107
+ url: "https://cdn.83io.com.br/library",
108
+ bifrost: {
109
+ versions: "/eitri-bifrost/versions/index.json"
110
+ },
111
+ luminusUi: {
112
+ versions: "/luminus-ui/versions/index.json"
113
+ },
114
+ }
115
+ }
105
116
  };
106
117
 
107
118
  module.exports = config;
@@ -103,6 +103,17 @@ const config = {
103
103
  my: "/workspace/my",
104
104
  check: "/workspace/check",
105
105
  },
106
+ cdn: {
107
+ library: {
108
+ url: "https://cdn.83io.com.br/library",
109
+ bifrost: {
110
+ versions: "/eitri-bifrost/versions/index.json"
111
+ },
112
+ luminusUi: {
113
+ versions: "/luminus-ui/versions/index.json"
114
+ },
115
+ }
116
+ }
106
117
  };
107
118
 
108
119
  module.exports = config;
package/index.js CHANGED
@@ -114,6 +114,17 @@ const run = async () => {
114
114
  );
115
115
  });
116
116
 
117
+ program
118
+ .command("libs")
119
+ .description("Bibliotecas do Eitri")
120
+ .option(
121
+ "-l, --list",
122
+ "Lista as bibliotecas do Eitri com suas versões"
123
+ )
124
+ .action((cmdObj) => {
125
+ require("./src/cmd/eitriLibs")(cmdObj);
126
+ });
127
+
117
128
  program.addCommand(VegvisirCommand());
118
129
 
119
130
  if (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eitri-cli",
3
- "version": "1.7.0-beta.4",
3
+ "version": "1.7.0-beta.6",
4
4
  "description": "Command Line Interface to make \"Eitri-App\" with code and fire.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -0,0 +1,38 @@
1
+ const {workspace} = require('../service/Workspace')
2
+ const TrackingService = require('../service/TrackingService')
3
+ const TrackingEitriAnalytics = require('../service/TrackingEitriAnalytics')
4
+ const LibsService = require('../service/LibsService')
5
+
6
+ const blindGuardian = workspace.blindGuardian
7
+ const trackingService = new TrackingService(blindGuardian)
8
+
9
+ module.exports = async function eitriLibs(cmdObj) {
10
+ if(cmdObj.list){
11
+ await listLibs()
12
+ }
13
+ }
14
+
15
+ async function listLibs() {
16
+ try {
17
+ const libsVersions = await LibsService.simultaneousRequestAndHandleData()
18
+ console.log("libsVersions", libsVersions)
19
+ TrackingEitriAnalytics.sendEvent({
20
+ eventName: "eitriLibs.listLibs",
21
+ userId: workspace?.userEmail,
22
+ data: libsVersions
23
+ })
24
+ process.exit(0)
25
+ } catch (e) {
26
+ TrackingEitriAnalytics.sendEvent({
27
+ eventName: "clean.error",
28
+ userId: workspace?.userEmail,
29
+ data: {
30
+ errorMessage: e?.message || ""
31
+ }
32
+ })
33
+
34
+
35
+ await trackingService.sendError(e)
36
+ process.exit(1)
37
+ }
38
+ }
@@ -8,27 +8,19 @@ const config = require('../service/ConfigService')
8
8
  const TargetService = require('../service/TargetService')
9
9
  const inquirer = require('inquirer')
10
10
  const TrackingEitriAnalytics = require('../service/TrackingEitriAnalytics')
11
- const UserLocalCredential = require('../util/UserLocalCredential')
12
11
  const VegvisirService = require('../modules/vegvisir/VegvisirService')
13
12
  const {randomUUID} = require('crypto')
14
13
  const childProcess = require('child_process')
15
14
  const blindGuardian = workspace.blindGuardian
16
- const trackingService = new TrackingService(blindGuardian)
17
15
  const targetService = new TargetService(workspace)
18
16
  const vegvisirService = new VegvisirService()
19
- const standardVersion = require('standard-version')
20
17
  const releaseService = require('../service/ReleaseService')
21
18
  const {isGitRepo} = require('../util/GenericUtils')
22
- const debug = require('debug')('eitri:pushVersion')
19
+ const PrerequisitesValidator = require('../service/PrerequisitesValidator')
20
+ const prerequisitesValidator = new PrerequisitesValidator(workspace)
23
21
 
24
22
  module.exports = async function pushVersion(cmdObj) {
25
- try {
26
- UserLocalCredential.checkForCredentials()
27
- } catch (error) {
28
- const errorMessage = cmdObj?.verbose ? error : error?.message
29
- console.error("\n", errorMessage, "\n")
30
- return
31
- }
23
+ prerequisitesValidator.checkCredentials()
32
24
 
33
25
  const {slug: miniConfSlug} = workspace.getMiniConf()
34
26
  await vegvisirService.isCurrentWorkspaceOwnedByUser(miniConfSlug)
package/src/cmd/start.js CHANGED
@@ -9,13 +9,14 @@ const config = require('../service/ConfigService')
9
9
  const handleStartServer = require('../service/StarterService')
10
10
  const TrackingEitriAnalytics = require('../service/TrackingEitriAnalytics')
11
11
  const VegvisirService = require('../modules/vegvisir/VegvisirService')
12
- const UserLocalCredential = require('../util/UserLocalCredential')
12
+ const PrerequisitesValidator = require('../service/PrerequisitesValidator')
13
13
 
14
14
  const blindGuardian = workspace.blindGuardian
15
15
  const hashFolder = workspace.hashFolder
16
16
  const trackingService = new TrackingService(blindGuardian, { ignoreCredentialError: true })
17
17
  const watcher = new Watcher(workspace, hashFolder, trackingService)
18
18
  const vegvisirService = new VegvisirService(workspace)
19
+ const prerequisitesValidator = new PrerequisitesValidator(workspace)
19
20
  const debug = require('debug')('eitri:start')
20
21
 
21
22
  module.exports = async function start(args) {
@@ -27,15 +28,7 @@ module.exports = async function start(args) {
27
28
  const separator = '======================================================================='
28
29
  let displayFriendlyErrorAtEnd = ""
29
30
 
30
- try {
31
- UserLocalCredential.checkForCredentials()
32
- debug("Successo na checagem de credenciais")
33
- } catch (error) {
34
- debug("ERRO na checagem de credenciais", {message: error?.message, error})
35
- const errorMessage = args?.verbose ? error : error?.message
36
- console.error("\n", errorMessage, "\n")
37
- return
38
- }
31
+ await prerequisitesValidator.checkAll()
39
32
 
40
33
  try {
41
34
  if (!args.force) {
@@ -125,7 +125,7 @@ module.exports = class VegvisirService {
125
125
  );
126
126
  const fileContent = await readFile(workspaceGlobalPath, "utf8");
127
127
  const workspace = JSON.parse(fileContent);
128
- console.log("Construindo de", workspace.id)
128
+ console.log(`Construindo para o Workspace [${workspace.id}]`)
129
129
  workspace.id = validateUUID(this.workspaceId) ? this.workspaceId : workspace.id;
130
130
  return workspace;
131
131
  } catch (error) {
@@ -0,0 +1,154 @@
1
+ const axios = require('axios')
2
+ const configService = require('./ConfigService')
3
+ const CDN_83io_LIBRARY = configService.get('cdn')?.library
4
+ const TrackingEitriAnalytics = require('./TrackingEitriAnalytics')
5
+
6
+ class LibsService {
7
+
8
+ static async validateLibsVersions({libs = [], eitriAppConf = {}}) {
9
+ const {luminusUiVersion, bifrostVersion} = this.getEitriConfLibsVersions(libs)
10
+ if (!luminusUiVersion) {
11
+ throw new Error("Nenhuma versão do [luminus-ui/eitri-app-components] encontrada em seu eitri-app.conf");
12
+ }
13
+
14
+ if (!bifrostVersion) {
15
+ throw new Error("Nenhuma versão do [bifrost/eitri-app-client] encontrada em seu eitri-app.conf");
16
+ }
17
+
18
+ const {luminusUiVersions, bifrostVersions} = await this.simultaneousRequestAndHandleData();
19
+ const allBifrostVersions = bifrostVersions?.versions?.concat(bifrostVersions?.betaVersions, bifrostVersions?.alphaVersions);
20
+
21
+ const existsLuminus = luminusUiVersions?.versions?.some(version => version === luminusUiVersion);
22
+ if (!existsLuminus) {
23
+ this.throwNonExistentLibError({
24
+ libName: "luminus-ui/eitri-app-components",
25
+ eitriConfLibVersion: luminusUiVersion,
26
+ availableVersions: luminusUiVersions,
27
+ eitriAppConf,
28
+ });
29
+ }
30
+
31
+ const existsBifrost = allBifrostVersions.some(version => version === bifrostVersion);
32
+ if (!existsBifrost) {
33
+ this.throwNonExistentLibError({
34
+ libName: "bifrost/eitri-app-client",
35
+ eitriConfLibVersion: bifrostVersion,
36
+ availableVersions: allBifrostVersions,
37
+ eitriAppConf,
38
+ });
39
+ }
40
+
41
+ }
42
+
43
+ static getEitriConfLibsVersions(libs = []) {
44
+ const luminusUiNames = ["eitri-app-components", "eitri-luminus"];
45
+ const biFrostNames = ["eitri-app-client", "eitri-bifrost"];
46
+ const bifrostVersion = libs.find(lib => biFrostNames?.includes(lib.name))?.version;
47
+ const luminusUiVersion = libs.find(lib => luminusUiNames?.includes(lib.name))?.version;
48
+
49
+ return {
50
+ luminusUiVersion,
51
+ bifrostVersion
52
+ }
53
+ }
54
+
55
+ static async simultaneousRequestAndHandleData() {
56
+ const promises = await Promise.allSettled([
57
+ this.getBifrostVersions(), this.getLuminusUiVersions()
58
+ ]).then(res => res).catch(err => err)
59
+
60
+ const [bifrost, luminus] = promises;
61
+
62
+ let allBifrostVersions = {};
63
+ if (bifrost?.status === "fulfilled") {
64
+ allBifrostVersions = bifrost.value
65
+ }
66
+
67
+ let allLuminusVersions = {};
68
+ if (luminus?.status === "fulfilled") {
69
+ allLuminusVersions = luminus.value
70
+ }
71
+
72
+ return {
73
+ luminusUiVersions: allLuminusVersions,
74
+ bifrostVersions: allBifrostVersions
75
+ }
76
+ }
77
+
78
+ static handleRawDatas(promises = []) {
79
+
80
+ const [bifrost, luminus] = promises;
81
+
82
+ const allBifrostVersions = [];
83
+ if (bifrost?.status === "fulfilled") {
84
+ const versions = bifrost?.value?.versions?.concat(bifrost?.value?.betaVersions, bifrost?.value?.alphaVersions);
85
+ allBifrostVersions.push(...versions)
86
+ }
87
+
88
+ const allLuminusVersions = [];
89
+ if (luminus?.status === "fulfilled") {
90
+ allLuminusVersions.push(...luminus.value.versions)
91
+ }
92
+
93
+ return {
94
+ luminusUiVersions: allLuminusVersions,
95
+ bifrostVersions: allBifrostVersions,
96
+ }
97
+ }
98
+
99
+
100
+ static async getBifrostVersions() {
101
+ const fullUrl = `${CDN_83io_LIBRARY.url}${CDN_83io_LIBRARY.bifrost.versions}`;
102
+ try {
103
+ const response = await axios.get(fullUrl)
104
+ return response.data
105
+ } catch (error) {
106
+ const errorMessage = error?.message || "Erro na obtenção de versões do Bifrost"
107
+ this.sendErrorToAnalytics("getBifrostVersions", errorMessage)
108
+ }
109
+ }
110
+
111
+ static async getLuminusUiVersions() {
112
+ const fullUrl = `${CDN_83io_LIBRARY.url}${CDN_83io_LIBRARY.luminusUi.versions}`;
113
+ try {
114
+ const response = await axios.get(fullUrl)
115
+ return response.data
116
+ } catch (error) {
117
+ const errorMessage = error?.message || "Erro na obtenção de versões do LuminusUI"
118
+ this.sendErrorToAnalytics("getLuminusUiVersions", errorMessage)
119
+ }
120
+ }
121
+
122
+ static sendErrorToAnalytics(method = "", errorMessage = "") {
123
+ TrackingEitriAnalytics.sendEvent({
124
+ eventName: `${method}.error`,
125
+ userId: "",
126
+ data: {errorMessage}
127
+ })
128
+ }
129
+
130
+ static throwNonExistentLibError(input = {libName: "", eitriConfLibVersion: "", availableVersions: [], eitriAppConf: {}}) {
131
+ const {libName, eitriConfLibVersion, availableVersions, eitriAppConf} = input
132
+
133
+ const friendlyErrorMessage = `Versão da biblioteca [${libName}] não encontrada`;
134
+ console.log(`\n\x1b[1m\x1b[31m${friendlyErrorMessage}\x1b[0m\n`);
135
+ console.log("Veja as versões disponíveis abaixo e atualize o arquivo eitri-app.conf\n");
136
+ console.log(availableVersions)
137
+
138
+ TrackingEitriAnalytics.sendEvent({
139
+ eventName: "version.eitri-libs.not.found",
140
+ userId: "",
141
+ data: {
142
+ errorMessage: `Versão da biblioteca ${libName} não encontrada`,
143
+ eitriConfLibVersion,
144
+ availableVersions,
145
+ eitriAppConf,
146
+ }
147
+ })
148
+
149
+ process.exit(1)
150
+ }
151
+
152
+ }
153
+
154
+ module.exports = LibsService
@@ -0,0 +1,84 @@
1
+ const configService = require('./ConfigService')
2
+ const UserLocalCredential = require('../util/UserLocalCredential');
3
+ const Http = require('./Http');
4
+ const TrackingEitriAnalytics = require('./TrackingEitriAnalytics');
5
+ const MANAGER_URL = configService.get('eitriManager')?.url
6
+ const {workspace} = require('../service/Workspace')
7
+ const debug = require('debug')('eitri:PrerequisitesValidator')
8
+ class PrerequisitesValidator {
9
+
10
+ constructor(workspace) {
11
+ this.workspace = workspace
12
+ this.blindGuardian = workspace.blindGuardian;
13
+ this.http = new Http(workspace.blindGuardian);
14
+ this.userInfo = {id: "", email: ""}
15
+ }
16
+
17
+ async checkAll() {
18
+ this.checkCredentials()
19
+ await this.isUserInOrg()
20
+ }
21
+
22
+ checkCredentials() {
23
+ try {
24
+ UserLocalCredential.checkForCredentials()
25
+ debug("Successo na checagem de credenciais")
26
+ } catch (error) {
27
+ this.sendErrorToAnalytics("checkCredentials.error", error)
28
+
29
+ debug("ERRO na checagem de credenciais", {message: error?.message, error})
30
+ console.error("\nError: ", {message: error?.message, error})
31
+ process.exit(1);
32
+ }
33
+ }
34
+
35
+ async isUserInOrg() {
36
+ const eitriAppConf = workspace.getMiniConf();
37
+
38
+ const respEitriAppData = await this.http.get(`${MANAGER_URL}/v2/eitri-apps/${eitriAppConf.id}`);
39
+ const respMyOrgsData = await this.http.get(`${MANAGER_URL}/users/me/organizations`);
40
+
41
+ const belongTo = respMyOrgsData?.some(org => org?.id === respEitriAppData?.organizationId)
42
+ const myOrgs = respMyOrgsData?.length > 0
43
+ if (myOrgs && belongTo) {
44
+ return
45
+ }
46
+
47
+ this.sendErrorToAnalytics("isUserInOrg.error", {confOrgId: respEitriAppData.organizationId, organizations: respMyOrgsData})
48
+
49
+ const friendlyErrorMessage = `Você ainda não foi registrado em nenhuma organização. Por favor, entre em contato com o administrador da sua organização.`
50
+ console.log(`\n\x1b[1m\x1b[31m ${friendlyErrorMessage} \x1b[0m\n`)
51
+ process.exit(1)
52
+ }
53
+
54
+ async getUserBasicInfo() {
55
+ if (this.userInfo.id && this.userInfo.email) {
56
+ return this.userInfo
57
+ }
58
+
59
+ const token = await this.blindGuardian.getToken().then(res => res).catch(_err => null)
60
+ this.userInfo = {
61
+ id: token?.id || "",
62
+ email: token?.email || ""
63
+ }
64
+ return {
65
+ id: token?.id || "",
66
+ email: token?.email || ""
67
+ }
68
+ }
69
+
70
+
71
+ sendErrorToAnalytics(eventName = "", data = {}) {
72
+ TrackingEitriAnalytics.sendEvent({
73
+ eventName,
74
+ userId: this.userInfo.id,
75
+ data: {
76
+ userData: this.userInfo,
77
+ ...data
78
+ }
79
+ }).catch(_err => null)
80
+ }
81
+
82
+ }
83
+
84
+ module.exports = PrerequisitesValidator
@@ -29,6 +29,7 @@ const VegvisirService = require("../modules/vegvisir/VegvisirService");
29
29
  const HuginService = require("./HuginService");
30
30
  const EitriAppType = require("../model/EitriAppType");
31
31
  const chalk = require("chalk");
32
+ const LibsService = require("./LibsService");
32
33
  const vegvisirService = new VegvisirService()
33
34
  const huginService = new HuginService()
34
35
 
@@ -207,6 +208,8 @@ class Workspace {
207
208
  await this.eitriAppService.writeEitriConf(remoteEitriConf, miniConf, this.folder2watch);
208
209
  }
209
210
 
211
+ await LibsService.validateLibsVersions({libs: state.libs, eitriAppConf: miniConf});
212
+
210
213
  this.printLibsVersion(state);
211
214
 
212
215
  await this.loadTarget(remoteTarget);
@@ -236,10 +239,10 @@ class Workspace {
236
239
  if (m) {
237
240
  version = m[1];
238
241
  }
239
- libVersionsOutput += ` ${lib.name} [${version}]\n`;
242
+ libVersionsOutput += ` ${lib.name} [${version}]`;
240
243
  }
241
244
  });
242
- console.log(libVersionsOutput);
245
+ console.log("\n",libVersionsOutput, "\n");
243
246
  }
244
247
 
245
248
  async checkVersions() {
@@ -1,5 +1,5 @@
1
1
  module.exports = {
2
2
  "version": "0.1.0",
3
- "eitri-app-components": "0.0.1",
4
- "eitri-app-client": "0.0.1"
3
+ "eitri-app-client":"1.0.0",
4
+ "eitri-app-components":"1.0.0"
5
5
  }
@@ -212,6 +212,43 @@ describe("eitri-cli", () => {
212
212
  2 * minutes
213
213
  );
214
214
 
215
+ it(
216
+ "should list eitri libs versions",
217
+ async () => {
218
+ try {
219
+ await execAsync(
220
+ `cd ${EITRI_WORK_DIR} && rm -rf ./eitri-test-*`,
221
+ { env: process.env }
222
+ );
223
+
224
+ const executor = new Executor({env: devEnv});
225
+ await executor
226
+ .exec("eitri libs -l")
227
+ .waitFor(/libsVersions/);
228
+ await executor
229
+ .exec("eitri libs -l")
230
+ .waitFor(/luminusUiVersions/);
231
+ await executor
232
+ .exec("eitri libs -l")
233
+ .waitFor(/versions/);
234
+ await executor
235
+ .exec("eitri libs -l")
236
+ .waitFor(/bifrostVersions/);
237
+ await executor
238
+ .exec("eitri libs -l")
239
+ .waitFor(/betaVersions/);
240
+ await executor
241
+ .exec("eitri libs -l")
242
+ .waitFor(/alphaVersions/);
243
+
244
+ } catch (e) {
245
+ console.error(e);
246
+ throw e;
247
+ }
248
+ },
249
+ 2 * minutes
250
+ );
251
+
215
252
  const getPublishedVersion = async (version, eitriAppId) => {
216
253
  const blindGuardian = new BlindGuardian();
217
254
  const http = new Http(blindGuardian);