eitri-cli 1.7.0 → 1.8.0-beta.2

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,24 @@ 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
+
128
+ program
129
+ .command("doctor")
130
+ .description("Valida as dependências externas para execução da CLI do Eitri")
131
+ .action((cmdObj) => {
132
+ require("./src/cmd/doctor")(cmdObj);
133
+ });
134
+
117
135
  program.addCommand(VegvisirCommand());
118
136
 
119
137
  if (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eitri-cli",
3
- "version": "1.7.0",
3
+ "version": "1.8.0-beta.2",
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,70 @@
1
+ const child_process = require("child_process");
2
+ const chalk = require("chalk");
3
+ const exec = child_process.exec;
4
+ const os = require("os");
5
+ module.exports = function () {
6
+ console.log("Checando dependências externas do Eitri CLI.\n");
7
+ checkGitDependency();
8
+ adbDependency();
9
+ xcodeCLIDependency();
10
+ };
11
+
12
+ const checkGitDependency = () => {
13
+ exec("git -v", (error, _, stderr) => {
14
+ if (error) {
15
+ console.log(
16
+ `[${chalk.red(
17
+ "✘"
18
+ )}] GIT. Para instalar basta acessar o link e seguir a documentação: https://git-scm.com/`
19
+ );
20
+ return;
21
+ }
22
+ if (stderr) {
23
+ console.log(
24
+ `[✘] GIT. Para instalar basta acessar o link e seguir a documentação: https://git-scm.com/`
25
+ );
26
+ return;
27
+ }
28
+ console.log(`[${chalk.green("✔")}] GIT`);
29
+ });
30
+ };
31
+
32
+ const adbDependency = () => {
33
+ exec("adb version", (error, _, stderr) => {
34
+ if (error) {
35
+ console.log(
36
+ `[${chalk.red(
37
+ "✘"
38
+ )}] ADB. Para instalar basta acessar o link e seguir a documentação: https://developer.android.com/tools/releases/platform-tools?hl=pt-br`
39
+ );
40
+ return;
41
+ }
42
+ if (stderr) {
43
+ console.log(
44
+ `[✘] ADB. Para instalar basta acessar o link e seguir a documentação: https://developer.android.com/tools/releases/platform-tools?hl=pt-br`
45
+ );
46
+ return;
47
+ }
48
+ console.log(`[${chalk.green("✔")}] ADB`);
49
+ });
50
+ };
51
+ const xcodeCLIDependency = () => {
52
+ if (os.platform() !== "darwin") return;
53
+ exec("xcrun version", (error, _, stderr) => {
54
+ if (error) {
55
+ console.log(
56
+ `[${chalk.red(
57
+ "✘"
58
+ )}] XCode. Para instalar basta acessar o link e seguir a documentação: https://developer.apple.com/documentation/Xcode`
59
+ );
60
+ return;
61
+ }
62
+ if (stderr) {
63
+ console.log(
64
+ `[✘] XCode. Para instalar basta acessar o link e seguir a documentação: https://developer.apple.com/documentation/Xcode`
65
+ );
66
+ return;
67
+ }
68
+ console.log(`[${chalk.green("✔")}] XCode`);
69
+ });
70
+ };
@@ -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)
@@ -184,8 +176,9 @@ ${await targetService.getAppConfExampleSnippet()}
184
176
  ...miniConf,
185
177
  organization
186
178
  },
187
- target,
179
+ application: target,
188
180
  startDate: `${start}`,
181
+ tempWorkspaceId
189
182
  }
190
183
  })
191
184
  process.exit(0)
package/src/cmd/start.js CHANGED
@@ -7,16 +7,16 @@ const TrackingService = require('../service/TrackingService')
7
7
  const fs = require('fs')
8
8
  const config = require('../service/ConfigService')
9
9
  const handleStartServer = require('../service/StarterService')
10
- const inquirer = require('inquirer')
11
10
  const TrackingEitriAnalytics = require('../service/TrackingEitriAnalytics')
12
11
  const VegvisirService = require('../modules/vegvisir/VegvisirService')
13
- const UserLocalCredential = require('../util/UserLocalCredential')
12
+ const PrerequisitesValidator = require('../service/PrerequisitesValidator')
14
13
 
15
14
  const blindGuardian = workspace.blindGuardian
16
15
  const hashFolder = workspace.hashFolder
17
16
  const trackingService = new TrackingService(blindGuardian, { ignoreCredentialError: true })
18
17
  const watcher = new Watcher(workspace, hashFolder, trackingService)
19
18
  const vegvisirService = new VegvisirService(workspace)
19
+ const prerequisitesValidator = new PrerequisitesValidator(workspace)
20
20
  const debug = require('debug')('eitri:start')
21
21
 
22
22
  module.exports = async function start(args) {
@@ -28,15 +28,7 @@ module.exports = async function start(args) {
28
28
  const separator = '======================================================================='
29
29
  let displayFriendlyErrorAtEnd = ""
30
30
 
31
- try {
32
- UserLocalCredential.checkForCredentials()
33
- debug("Successo na checagem de credenciais")
34
- } catch (error) {
35
- debug("ERRO na checagem de credenciais", {message: error?.message, error})
36
- const errorMessage = args?.verbose ? error : error?.message
37
- console.error("\n", errorMessage, "\n")
38
- return
39
- }
31
+ await prerequisitesValidator.checkAll()
40
32
 
41
33
  try {
42
34
  if (!args.force) {
@@ -59,20 +51,6 @@ module.exports = async function start(args) {
59
51
  debug("Informações do setupResult do workspace", {setupResult})
60
52
 
61
53
  const target = setupResult.target.name
62
-
63
- let targetConfig = {}
64
-
65
- if(args.listTargetConfigs) {
66
- await listTargetConfigs(target)
67
- process.exit(1)
68
- }
69
-
70
- debug("Verificando se há targetConfig nos argumentos", {targetConfig: args?.targetConfig})
71
- if(args.targetConfig) {
72
- targetConfig = await askTargetConfig(args, target)
73
- } else {
74
- targetConfig = await getDefaultTargetConfig(target)
75
- }
76
54
 
77
55
  blindGuardian.readConf()
78
56
  const qrCodeUrl = config.get('qrCode').url
@@ -126,16 +104,15 @@ module.exports = async function start(args) {
126
104
  ...args,
127
105
  deepLinks: loadedTarget?.deepLinks || []
128
106
  }
129
- debug("Iniciando servidor", {argsWithDeeplinks, trackingService, watcher, workspace, target, targetConfig, platform})
130
- await handleStartServer(argsWithDeeplinks, trackingService, watcher, workspace, target, targetConfig, platform)
107
+ debug("Iniciando servidor", {argsWithDeeplinks, trackingService, watcher, workspace, target, setupResult, platform})
108
+ await handleStartServer(argsWithDeeplinks, trackingService, watcher, workspace, target, setupResult, platform)
131
109
  debug("Servidor iniciado", {loadedTarget})
132
110
 
133
111
  TrackingEitriAnalytics.sendEvent({
134
112
  eventName:"start",
135
113
  userId: workspace?.userEmail,
136
114
  data: {
137
- workspace,
138
- userWorkspace,
115
+ workspaceId: userWorkspace.id,
139
116
  miniConf,
140
117
  args
141
118
  }
@@ -177,34 +154,3 @@ module.exports = async function start(args) {
177
154
  }
178
155
  }
179
156
  }
180
-
181
- async function askTargetConfig(args, target) {
182
- const availableConfigs = await workspace.getTargetConfig(args.targetConfig, target)
183
-
184
- console.log(`Utilizando configuração: ${availableConfigs[0].id}`)
185
- return availableConfigs[0]
186
-
187
- }
188
-
189
- async function getDefaultTargetConfig(target) {
190
- const configs = await workspace.getTargetConfig('default', target)
191
- return configs[0]
192
- }
193
-
194
- async function listTargetConfigs(target) {
195
- const availableConfigs = await workspace.getAllTargetConfigs(target)
196
-
197
- const availableConfigsIds = availableConfigs.map(config => config.id)
198
-
199
- const res = await inquirer.prompt([
200
- {
201
- name: 'accepted',
202
- type: 'rawlist',
203
- message: 'Configurações disponíveis:',
204
- choices: availableConfigsIds
205
- }
206
- ]).then(input => input)
207
-
208
- const config = availableConfigs.find(cfg => cfg.id === res.accepted)
209
- console.log(`Utilize o comando --target-config ${config.id} para iniciar o Eitri-App com a configuração desejada`)
210
- }
@@ -1,15 +1,4 @@
1
1
  /* eslint-disable no-unused-vars */
2
- class TargetConfig {
3
- constructor() {
4
- this.id = ''
5
- this.libUrl = ''
6
- this.runnerUrl = ''
7
- this.bootstrapBaseUrl = ''
8
- this.askUserDataApiUrl = ''
9
- this.default = ''
10
- }
11
- }
12
-
13
2
  class MiniAppBoilerplateList {
14
3
  constructor() {
15
4
  this.name = ''
@@ -57,10 +46,6 @@ module.exports = class Target {
57
46
  */
58
47
  this.platform= ''
59
48
  /**
60
- * @type {TargetConfig[]}
61
- */
62
- this.targetConfig= ''
63
- /**
64
49
  * @type {string}
65
50
  */
66
51
  this.sdkSupport= ''
@@ -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) {
@@ -17,6 +17,11 @@ class CliLogin {
17
17
 
18
18
  devUser = developerKeyParsed?.clientId
19
19
  devKey = developerKeyParsed?.clientSecret
20
+ TrackingEitriAnalytics.sendEvent({
21
+ eventName: 'login',
22
+ userId: email,
23
+ data: {}
24
+ })
20
25
  } catch (error) {
21
26
  console.error("\n", "Não foi possível realizar o seu login. Por favor, verique as credenciais.")
22
27
  TrackingEitriAnalytics.sendEvent({
@@ -0,0 +1,158 @@
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
+ if(!luminusUiVersion.includes("@")){
22
+ const existsLuminus = luminusUiVersions?.versions?.some(version => version === luminusUiVersion);
23
+ if (!existsLuminus) {
24
+ this.throwNonExistentLibError({
25
+ libName: "luminus-ui/eitri-app-components",
26
+ eitriConfLibVersion: luminusUiVersion,
27
+ availableVersions: luminusUiVersions,
28
+ eitriAppConf,
29
+ });
30
+ }
31
+ }
32
+
33
+ if(!bifrostVersion.includes("@")){
34
+ const existsBifrost = allBifrostVersions.some(version => version === bifrostVersion);
35
+ if (!existsBifrost) {
36
+ this.throwNonExistentLibError({
37
+ libName: "bifrost/eitri-app-client",
38
+ eitriConfLibVersion: bifrostVersion,
39
+ availableVersions: allBifrostVersions,
40
+ eitriAppConf,
41
+ });
42
+ }
43
+ }
44
+
45
+ }
46
+
47
+ static getEitriConfLibsVersions(libs = []) {
48
+ const luminusUiNames = ["eitri-app-components", "eitri-luminus"];
49
+ const biFrostNames = ["eitri-app-client", "eitri-bifrost"];
50
+ const bifrostVersion = libs.find(lib => biFrostNames?.includes(lib.name))?.version;
51
+ const luminusUiVersion = libs.find(lib => luminusUiNames?.includes(lib.name))?.version;
52
+
53
+ return {
54
+ luminusUiVersion,
55
+ bifrostVersion
56
+ }
57
+ }
58
+
59
+ static async simultaneousRequestAndHandleData() {
60
+ const promises = await Promise.allSettled([
61
+ this.getBifrostVersions(), this.getLuminusUiVersions()
62
+ ]).then(res => res).catch(err => err)
63
+
64
+ const [bifrost, luminus] = promises;
65
+
66
+ let allBifrostVersions = {};
67
+ if (bifrost?.status === "fulfilled") {
68
+ allBifrostVersions = bifrost.value
69
+ }
70
+
71
+ let allLuminusVersions = {};
72
+ if (luminus?.status === "fulfilled") {
73
+ allLuminusVersions = luminus.value
74
+ }
75
+
76
+ return {
77
+ luminusUiVersions: allLuminusVersions,
78
+ bifrostVersions: allBifrostVersions
79
+ }
80
+ }
81
+
82
+ static handleRawDatas(promises = []) {
83
+
84
+ const [bifrost, luminus] = promises;
85
+
86
+ const allBifrostVersions = [];
87
+ if (bifrost?.status === "fulfilled") {
88
+ const versions = bifrost?.value?.versions?.concat(bifrost?.value?.betaVersions, bifrost?.value?.alphaVersions);
89
+ allBifrostVersions.push(...versions)
90
+ }
91
+
92
+ const allLuminusVersions = [];
93
+ if (luminus?.status === "fulfilled") {
94
+ allLuminusVersions.push(...luminus.value.versions)
95
+ }
96
+
97
+ return {
98
+ luminusUiVersions: allLuminusVersions,
99
+ bifrostVersions: allBifrostVersions,
100
+ }
101
+ }
102
+
103
+
104
+ static async getBifrostVersions() {
105
+ const fullUrl = `${CDN_83io_LIBRARY.url}${CDN_83io_LIBRARY.bifrost.versions}`;
106
+ try {
107
+ const response = await axios.get(fullUrl)
108
+ return response.data
109
+ } catch (error) {
110
+ const errorMessage = error?.message || "Erro na obtenção de versões do Bifrost"
111
+ this.sendErrorToAnalytics("getBifrostVersions", errorMessage)
112
+ }
113
+ }
114
+
115
+ static async getLuminusUiVersions() {
116
+ const fullUrl = `${CDN_83io_LIBRARY.url}${CDN_83io_LIBRARY.luminusUi.versions}`;
117
+ try {
118
+ const response = await axios.get(fullUrl)
119
+ return response.data
120
+ } catch (error) {
121
+ const errorMessage = error?.message || "Erro na obtenção de versões do LuminusUI"
122
+ this.sendErrorToAnalytics("getLuminusUiVersions", errorMessage)
123
+ }
124
+ }
125
+
126
+ static sendErrorToAnalytics(method = "", errorMessage = "") {
127
+ TrackingEitriAnalytics.sendEvent({
128
+ eventName: `${method}.error`,
129
+ userId: "",
130
+ data: {errorMessage}
131
+ })
132
+ }
133
+
134
+ static throwNonExistentLibError(input = {libName: "", eitriConfLibVersion: "", availableVersions: [], eitriAppConf: {}}) {
135
+ const {libName, eitriConfLibVersion, availableVersions, eitriAppConf} = input
136
+
137
+ const friendlyErrorMessage = `Versão da biblioteca [${libName}] não encontrada`;
138
+ console.log(`\n\x1b[1m\x1b[31m${friendlyErrorMessage}\x1b[0m\n`);
139
+ console.log("Veja as versões disponíveis abaixo e atualize o arquivo eitri-app.conf\n");
140
+ console.log(availableVersions)
141
+
142
+ TrackingEitriAnalytics.sendEvent({
143
+ eventName: "version.eitri-libs.not.found",
144
+ userId: "",
145
+ data: {
146
+ errorMessage: `Versão da biblioteca ${libName} não encontrada`,
147
+ eitriConfLibVersion,
148
+ availableVersions,
149
+ eitriAppConf,
150
+ }
151
+ })
152
+
153
+ process.exit(1)
154
+ }
155
+
156
+ }
157
+
158
+ 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
@@ -4,7 +4,7 @@ const WebStarterFactory = require('./factories/WebStarterFactory')
4
4
 
5
5
 
6
6
  const strategy = require('./GATrackingStrategy')
7
- async function handleStartServer(args, trackingService, watcher, workspace, factoryName, targetConfig, platform) {
7
+ async function handleStartServer(args, trackingService, watcher, workspace, factoryName, setupConfig, platform) {
8
8
  const factories = {
9
9
  mobile: new QRCodeStarterFactory(),
10
10
  web: new WebStarterFactory(),
@@ -24,7 +24,7 @@ async function handleStartServer(args, trackingService, watcher, workspace, fact
24
24
  }
25
25
 
26
26
 
27
- const starter = await factory.create(args, trackingService, watcher, workspace, targetConfig)
27
+ const starter = await factory.create(args, trackingService, watcher, workspace, setupConfig)
28
28
  await starter.startServer()
29
29
  }
30
30
 
@@ -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
 
@@ -93,49 +94,6 @@ class Workspace {
93
94
  return this.resourceFolders2watch;
94
95
  }
95
96
 
96
-
97
- async getTargetConfig(id, target) {
98
- try {
99
- const configs = await this.getAllTargetConfigs(target);
100
- const config = configs.find((cfg) => cfg.id === id);
101
-
102
- if (!config) {
103
- console.log(
104
- `TargetConfig [${target}] não encontrado, utilize o comando --list-target-configs para ver as configurações disponíveis`
105
- );
106
- process.exit(1);
107
- }
108
-
109
- return [config];
110
- } catch (e) {
111
- console.log(`Erro ao buscar configuração: ${e}`);
112
- if (process.env.NODE_ENV !== 'test') {
113
- process.exit(1);
114
- }
115
- }
116
- }
117
-
118
- async getAllTargetConfigs(applicationName) {
119
- // const targetUrl = `${this.config.url}${this.config.targetPath}?name=${target}`
120
- try {
121
- // const response = await axios.get(targetUrl)
122
- // const fullTarget = response.data
123
-
124
- const targets = await this.availableTargets();
125
- const fullTarget = targets.filter(
126
- (a) => a.name === applicationName
127
- );
128
- const configs = fullTarget[0].targetConfig;
129
-
130
- return configs;
131
- } catch (e) {
132
- console.log(`Erro ao buscar configuração: ${e}`);
133
- if (process.env.NODE_ENV !== 'test') {
134
- process.exit(1);
135
- }
136
- }
137
- }
138
-
139
97
  getTarget() {
140
98
  if (!this.target) {
141
99
  console.warn("Target não foi detectado no setup()");
@@ -250,6 +208,8 @@ class Workspace {
250
208
  await this.eitriAppService.writeEitriConf(remoteEitriConf, miniConf, this.folder2watch);
251
209
  }
252
210
 
211
+ await LibsService.validateLibsVersions({libs: state.libs, eitriAppConf: miniConf});
212
+
253
213
  this.printLibsVersion(state);
254
214
 
255
215
  await this.loadTarget(remoteTarget);
@@ -279,10 +239,10 @@ class Workspace {
279
239
  if (m) {
280
240
  version = m[1];
281
241
  }
282
- libVersionsOutput += ` ${lib.name} [${version}]\n`;
242
+ libVersionsOutput += ` ${lib.name} [${version}]`;
283
243
  }
284
244
  });
285
- console.log(libVersionsOutput);
245
+ console.log("\n",libVersionsOutput, "\n");
286
246
  }
287
247
 
288
248
  async checkVersions() {
@@ -357,51 +317,6 @@ class Workspace {
357
317
  return Base64.encode(JSON.stringify(miniAppData));
358
318
  }
359
319
 
360
- async getWorkspaceURL(args, targetConfig) {
361
- args = args || {};
362
- const cookie = await this.http.getCookieSession(this.serverUrl);
363
- let paramOrderId = "";
364
- let paramShareId = "";
365
- let cid;
366
- const viewHtml = (args.view || "index") + ".html";
367
- const miniAppConf = this.getMiniConf();
368
- const data = {
369
- publicKey: miniAppConf["public-key"],
370
- metadata: miniAppConf["metadata"],
371
- slug: miniAppConf["slug"],
372
- title: miniAppConf["title"],
373
- };
374
- if (args.orderId) {
375
- paramOrderId = "&orderId=" + encodeURIComponent(args.orderId);
376
- }
377
- if (args.shareId) {
378
- paramShareId = "&shareId=" + encodeURIComponent(args.shareId);
379
- }
380
- if (args.initializationParams) {
381
- data.initializationParams = args.initializationParams;
382
- }
383
- const encodedData = Base64.encode(JSON.stringify(data));
384
- if (cookie) {
385
- cid = Base64.encode(cookie.cookieString());
386
- }
387
-
388
- if (!targetConfig.bootstrapBaseUrl) {
389
- throw new Error(
390
- "Workspace.getWorkspaceURL.internalError#missingBootstrapBaseUrl"
391
- );
392
- }
393
-
394
- let miniAppUrl = `${this.getBootstrapURL(
395
- targetConfig.bootstrapBaseUrl
396
- )}/${this.config.basePath || "workspace"
397
- }/user/${(await vegvisirService.getWorkspace()).id}/${viewHtml}?data=${encodedData}${paramOrderId}${paramShareId}&devmode=true`;
398
-
399
- if (cid) {
400
- miniAppUrl = miniAppUrl + "&cid=" + cid;
401
- }
402
- return miniAppUrl;
403
- }
404
-
405
320
  /**
406
321
  *
407
322
  * @param {string} bootstrapBaseUrl
@@ -419,13 +334,11 @@ class Workspace {
419
334
  return bootstrapBaseUrl;
420
335
  }
421
336
 
422
- async getNewWorkspaceURL(args, targetConfig) {
423
- const qrCodeConfig = await this.getQrCodeConfig(args, targetConfig);
337
+ async getNewWorkspaceURL(args, setupConfig) {
338
+ const qrCodeConfig = await this.getQrCodeConfig(args, setupConfig);
424
339
  const stateData = await this.saveShareState(qrCodeConfig);
425
340
  const stateId = stateData.id;
426
- const miniAppUrl = `${this.qrCodeUrl}/${stateId}?environment=${(process.env.NODE_ENV === "hmlv2" ? "hml" : process.env.NODE_ENV) ||
427
- "hml"
428
- }`;
341
+ const miniAppUrl = `${this.qrCodeUrl}/${stateId}`;
429
342
  return {
430
343
  miniAppConf: {
431
344
  ...qrCodeConfig,
@@ -448,7 +361,7 @@ class Workspace {
448
361
  return response.data;
449
362
  }
450
363
 
451
- async getQrCodeConfig(args, targetConfig) {
364
+ async getQrCodeConfig(args, setupConfig) {
452
365
  args = args || {};
453
366
  const cookie = await this.http.getCookieSession(this.serverUrl);
454
367
  let cid;
@@ -468,10 +381,7 @@ class Workspace {
468
381
  slug: miniAppConf["slug"],
469
382
  title: miniAppConf["title"],
470
383
  permissions: miniAppConf["permissions"],
471
-
472
- // Se nao enviarmos essa url pronta, o superapp tera que monta-la
473
- // Essa url chama a funcao users.js do workspace-api
474
- miniAppBootstrapUrl: await this.getWorkspaceURL(args, targetConfig),
384
+ miniAppBootstrapUrl: this.getBootstrapURL(setupConfig.eitriAppBootstrapURL),
475
385
  initializationParams,
476
386
  orderId,
477
387
  view,
@@ -9,29 +9,20 @@ function QRCodeStarter(
9
9
  trackingService,
10
10
  watcher,
11
11
  workspace,
12
- targetConfig
12
+ setupConfig
13
13
  ) {
14
14
  this.args = args;
15
15
  this.trackingService = trackingService;
16
16
  this.watcher = watcher;
17
17
  this.workspace = workspace;
18
- this.targetConfig = targetConfig;
18
+ this.setupConfig = setupConfig;
19
19
 
20
20
  this.startServer = async function () {
21
- let fullUrl;
22
- if (this.args.oldQrcode) {
23
- fullUrl = await this.workspace.getWorkspaceURL(
21
+ const workspaceURLConfig = await this.workspace.getNewWorkspaceURL(
24
22
  this.args,
25
- this.targetConfig
23
+ this.setupConfig
26
24
  );
27
- } else {
28
- const { miniAppUrl } = await this.workspace.getNewWorkspaceURL(
29
- this.args,
30
- this.targetConfig
31
- );
32
- fullUrl = miniAppUrl;
33
- }
34
-
25
+ const fullUrl = workspaceURLConfig.miniAppUrl
35
26
  if (this.args.verbose) {
36
27
  console.log(`QrCodeUrl: ${fullUrl}`);
37
28
  }
@@ -130,14 +121,14 @@ function QRCodeContentFactory() {
130
121
  trackingService,
131
122
  watcher,
132
123
  workspace,
133
- targetConfig
124
+ setupConfig
134
125
  ) {
135
126
  return new QRCodeStarter(
136
127
  args,
137
128
  trackingService,
138
129
  watcher,
139
130
  workspace,
140
- targetConfig
131
+ setupConfig
141
132
  );
142
133
  };
143
134
  }
@@ -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);
@@ -131,126 +131,6 @@ describe('Workspace', () => {
131
131
  ])
132
132
  })
133
133
  })
134
-
135
- describe('.getWorkspaceURL()', () => {
136
- beforeEach(() => {
137
- workspace.userEmail = 'dev@calindra.com.br'
138
- workspace.target = {
139
- bootstrapBaseUrl: 'http://minhaconta.base.url'
140
- }
141
- workspace.folder2watch = path.resolve(
142
- __dirname,
143
- '..',
144
- '_fixtures',
145
- 'src'
146
- )
147
- })
148
-
149
- it('retorna a url do workspace do usuario apontando para index.html', async () => {
150
- let url = await workspace.getWorkspaceURL('', {bootstrapBaseUrl: 'http://minhaconta.base.url'})
151
- expect(url).toContain('/index.html?')
152
- })
153
-
154
- it('Deve retornar queries string ', async () => {
155
- let args = {
156
- initializationParams: {
157
- foo: 'bar'
158
- }
159
- }
160
- let urlValue = await workspace.getWorkspaceURL(args, {bootstrapBaseUrl: 'http://minhaconta.base.url'})
161
- console.log(urlValue)
162
- let query = url.parse(urlValue, true).query
163
- let dataString = Buffer.from(query.data, 'base64').toString()
164
- let data = JSON.parse(dataString)
165
- expect(data.initializationParams).toMatchObject(args.initializationParams)
166
- })
167
-
168
- it('retorna a url do workspace do usuario apontando para OrderDetails.html', async () => {
169
- let url = await workspace.getWorkspaceURL({ view: 'OrderDetails' }, {bootstrapBaseUrl: 'http://minhaconta.base.url'})
170
- expect(url).toContain('/OrderDetails.html?')
171
- })
172
-
173
- it('retorna a url do workspace do usuario com o parametro order id', async () => {
174
- let url = await workspace.getWorkspaceURL({
175
- view: 'OrderDetails',
176
- orderId: 'e08a2547-b8d6-4437-91a7-0bc67987689d',
177
- }, {bootstrapBaseUrl: 'http://minhaconta.base.url'})
178
- expect(url).toContain(
179
- 'orderId=e08a2547-b8d6-4437-91a7-0bc67987689d'
180
- )
181
- })
182
- })
183
- describe('.getTargetConfig() & .getAllTargetConfigs()', () => {
184
- const target = 'CALINDRA_MOBILE'
185
- const res = [
186
- {
187
- id: 7,
188
- name: 'CALINDRA_MOBILE',
189
- minimumCliVersion: '1.16.5',
190
- boilerplateUrl: 'https://github.com/Calindra/servless-backend-template.git',
191
- superAppClientLibName: 'eitri-app-client',
192
- componentsLibName: 'eitri-app-components',
193
- description: 'CALINDRA_MOBILE',
194
- status: 'ACTIVE',
195
- platform: 'mobile',
196
- targetConfig: [
197
- {
198
- id: 'default',
199
- libUrl: 'https://www.npmjs.com/package/eitri-app-client',
200
- runnerUrl: 'https://dev.eitri.calindra.com.br/app/',
201
- bootstrapBaseUrl: 'https://dev.eitri.calindra.com.br',
202
- askUserDataApiUrl: 'https://dev.eitri.calindra.com.br/miniapp-manager-api/o/mini-apps/:slug/token'
203
- },
204
- {
205
- id: 'ws',
206
- libUrl: 'https://www.npmjs.com/package/eitri-app-client',
207
- runnerUrl: 'https://dev.eitri.calindra.com.br/app/',
208
- bootstrapBaseUrl: 'http://localhost:3333',
209
- askUserDataApiUrl: 'https://dev.eitri.calindra.com.br/miniapp-manager-api/p/mini-apps/:slug/token/foundry'
210
- }
211
- ],
212
- default: true
213
- }
214
- ]
215
-
216
- beforeEach(() => {
217
- nock.cleanAll()
218
- nock('https://dev.eitri.calindra.com.br')
219
- .get(/\/eitri-manager-api\/p\/users\/self\/targets/).reply(200, res)
220
- })
221
-
222
- it('deve receber a configuração correta', async () => {
223
- const config = await workspace.getTargetConfig('default', target)
224
- expect(config[0]).toStrictEqual({
225
- id: 'default',
226
- libUrl: 'https://www.npmjs.com/package/eitri-app-client',
227
- runnerUrl: 'https://dev.eitri.calindra.com.br/app/',
228
- bootstrapBaseUrl: 'https://dev.eitri.calindra.com.br',
229
- askUserDataApiUrl: 'https://dev.eitri.calindra.com.br/miniapp-manager-api/o/mini-apps/:slug/token'
230
- })
231
-
232
- }
233
- )
234
- it('deve retornar todos os configs', async () => {
235
- const config = await workspace.getAllTargetConfigs(target)
236
- expect(config).toMatchObject([
237
- {
238
- id: 'default',
239
- libUrl: 'https://www.npmjs.com/package/eitri-app-client',
240
- runnerUrl: 'https://dev.eitri.calindra.com.br/app/',
241
- bootstrapBaseUrl: 'https://dev.eitri.calindra.com.br',
242
- askUserDataApiUrl: 'https://dev.eitri.calindra.com.br/miniapp-manager-api/o/mini-apps/:slug/token'
243
- },
244
- {
245
- id: 'ws',
246
- libUrl: 'https://www.npmjs.com/package/eitri-app-client',
247
- runnerUrl: 'https://dev.eitri.calindra.com.br/app/',
248
- bootstrapBaseUrl: 'http://localhost:3333',
249
- askUserDataApiUrl: 'https://dev.eitri.calindra.com.br/miniapp-manager-api/p/mini-apps/:slug/token/foundry'
250
- }
251
- ])
252
- })
253
- })
254
134
 
255
135
  describe('.availableTargets()', () => {
256
136