eitri-cli 1.0.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.
Files changed (122) hide show
  1. package/README.md +54 -0
  2. package/bitbucket-pipelines.toBeChanged.yml +64 -0
  3. package/boilerplate/mini-app-cafe-madeira.zip +0 -0
  4. package/check-version.js +12 -0
  5. package/config/default-eitri.js +1 -0
  6. package/config/dev.js +91 -0
  7. package/config/k8s-eitri.js +92 -0
  8. package/config/loc-eitri.js +92 -0
  9. package/config/prod-eitri.js +92 -0
  10. package/config/test-eitri.js +2 -0
  11. package/index-eitri.js +6 -0
  12. package/index.js +182 -0
  13. package/install-dev.bat +1 -0
  14. package/install-dev.sh +1 -0
  15. package/jest.config.js +6 -0
  16. package/jsconfig.json +9 -0
  17. package/package.json +80 -0
  18. package/publisher.js +53 -0
  19. package/src/cmd/clean.js +179 -0
  20. package/src/cmd/create.js +281 -0
  21. package/src/cmd/credentials.js +105 -0
  22. package/src/cmd/invite.js +87 -0
  23. package/src/cmd/list.js +36 -0
  24. package/src/cmd/login.js +51 -0
  25. package/src/cmd/manage-env.js +129 -0
  26. package/src/cmd/open-share.js +6 -0
  27. package/src/cmd/order-details.js +6 -0
  28. package/src/cmd/push-version.js +182 -0
  29. package/src/cmd/show-message-if-outdated-package.js +32 -0
  30. package/src/cmd/signup.js +69 -0
  31. package/src/cmd/start.js +171 -0
  32. package/src/cmd/tail-logs.js +26 -0
  33. package/src/cmd/test-initialization-params.js +6 -0
  34. package/src/cmd/validate.js +170 -0
  35. package/src/cmd/version.js +29 -0
  36. package/src/enum/WatcherOpts.js +3 -0
  37. package/src/enum/target.js +6 -0
  38. package/src/helpers/request-listener-helper.js +55 -0
  39. package/src/model/Payload.js +45 -0
  40. package/src/model/Target.js +76 -0
  41. package/src/model/User.js +11 -0
  42. package/src/service/AuthConfig.js +88 -0
  43. package/src/service/BlindGuardian.js +134 -0
  44. package/src/service/CliLogin.js +47 -0
  45. package/src/service/ConfigService.js +16 -0
  46. package/src/service/CredentialsService.js +47 -0
  47. package/src/service/GATrackingStrategy.js +16 -0
  48. package/src/service/HashFolder.js +79 -0
  49. package/src/service/Http.js +234 -0
  50. package/src/service/InviteService.js +45 -0
  51. package/src/service/ManageEnvService.js +10 -0
  52. package/src/service/MiniLog.js +132 -0
  53. package/src/service/QRCodeFactory.js +43 -0
  54. package/src/service/Server.js +239 -0
  55. package/src/service/StarterService.js +31 -0
  56. package/src/service/TagTree.js +101 -0
  57. package/src/service/TargetService.js +97 -0
  58. package/src/service/TrackService.js +11 -0
  59. package/src/service/TrackingEitriAnalytics.js +32 -0
  60. package/src/service/TrackingService.js +183 -0
  61. package/src/service/ValidateResult.js +57 -0
  62. package/src/service/Watcher.js +119 -0
  63. package/src/service/Workspace.js +1069 -0
  64. package/src/service/WorkspaceManager.js +74 -0
  65. package/src/service/factories/DoubtsStarterFactory.js +25 -0
  66. package/src/service/factories/MiniWebAppFactory.js +43 -0
  67. package/src/service/factories/QRCodeStarterFactory.js +78 -0
  68. package/src/service/factories/WebStarterFactory.js +88 -0
  69. package/src/service/factories/WoodCoffeeFactory.js +230 -0
  70. package/src/util/AboutTemplate.jsx +14 -0
  71. package/src/util/UrlUtils.js +12 -0
  72. package/src/util/UserLocalCredential.js +122 -0
  73. package/src/util/error-messages/error-messages.js +24 -0
  74. package/src/util/error-messages/invite/invite-error-messages.js +14 -0
  75. package/src/util/getCliVersion.js +13 -0
  76. package/src/util/getCreateFactory.js +9 -0
  77. package/src/util/ipv4.js +19 -0
  78. package/src/util/manage-env.js +65 -0
  79. package/src/util/open-docs.js +7 -0
  80. package/src/util/os.js +39 -0
  81. package/src/util/server-url.js +15 -0
  82. package/src/util/template-utils.js +21 -0
  83. package/src/view/index.html +19 -0
  84. package/targetMobileStickyness.md +47 -0
  85. package/targetWebStickyness.md +40 -0
  86. package/test/_fixtures/factory.js +30 -0
  87. package/test/_fixtures/miniWebApp/miniapp.conf.js +4 -0
  88. package/test/_fixtures/miniapp.conf.js +5 -0
  89. package/test/_fixtures/server/HelloWorldBackend.js +7 -0
  90. package/test/_fixtures/src/Home.js +5 -0
  91. package/test/_fixtures/src/Home2.js +5 -0
  92. package/test/_fixtures/src/commons/util.js +3 -0
  93. package/test/_fixtures/src/components/TagA.jsx +4 -0
  94. package/test/_fixtures/src/components/TagB.jsx +4 -0
  95. package/test/_fixtures/src/components/TagC.jsx +3 -0
  96. package/test/_fixtures/src/components/TagD.jsx +3 -0
  97. package/test/_fixtures/src/server/foo.js +7 -0
  98. package/test/_fixtures/src/views/AboutTemplate.jsx +14 -0
  99. package/test/_fixtures/woodcoffee/miniapp.conf.js +3 -0
  100. package/test/ame.conf.js +3 -0
  101. package/test/cmd/clean.test.js +66 -0
  102. package/test/cmd/create.test.js +252 -0
  103. package/test/cmd/credentials.test.js +159 -0
  104. package/test/cmd/list.test.js +74 -0
  105. package/test/cmd/manage-env.test.js +168 -0
  106. package/test/cmd/signup.test.js +20 -0
  107. package/test/cmd/start.test.js +5 -0
  108. package/test/miniapp.conf.js +3 -0
  109. package/test/model/Payload.test.js +35 -0
  110. package/test/service/BlindGuardian.test.js +84 -0
  111. package/test/service/CheckAmeConf.test.js +313 -0
  112. package/test/service/Http.test.js +312 -0
  113. package/test/service/InviteService.test.js +117 -0
  114. package/test/service/MiniWebAppFactory.test.js +40 -0
  115. package/test/service/TagTree.test.js +81 -0
  116. package/test/service/TargetService.test.js +48 -0
  117. package/test/service/TrackingService.test.js +105 -0
  118. package/test/service/UserAmeConf.test.js +47 -0
  119. package/test/service/WoodCoffeeFactory.test.js +148 -0
  120. package/test/service/Workspace.test.js +364 -0
  121. package/thinQrCode.md +58 -0
  122. package/v1.5.0.md +3 -0
@@ -0,0 +1,281 @@
1
+ const Watcher = require('../service/Watcher')
2
+ const inquirer = require('inquirer')
3
+ const slugify = require('slugify')
4
+ const config = require('config')
5
+ const { Workspace } = require('../service/Workspace')
6
+ const BlindGuardian = require('../service/BlindGuardian')
7
+ const HashFolder = require('../service/HashFolder')
8
+ const TrackingService = require('../service/TrackingService')
9
+ const { NAME_TITLE_REGEX, SLUG_REGEX } = require('./validate')
10
+ const handleStartServer = require('../service/StarterService')
11
+ const getCreateFactory = require('../util/getCreateFactory')
12
+ const UrlUtils = require('../util/UrlUtils')
13
+
14
+ // eslint-disable-next-line no-unused-vars
15
+ const Target = require('../model/Target')
16
+ const TrackingEitriAnalytics = require('../service/TrackingEitriAnalytics')
17
+
18
+ const blindGuardian = new BlindGuardian()
19
+ const hashFolder = new HashFolder()
20
+ const workspace = new Workspace(blindGuardian, hashFolder)
21
+ const trackingService = new TrackingService(blindGuardian, { ignoreCredentialError: true })
22
+ const watcher = new Watcher(workspace, hashFolder, trackingService)
23
+ const ITEM_DOUBT = 'DOUBTS'
24
+
25
+ const notBlank = (inpt) => {
26
+ if (!inpt || !inpt.trim()) {
27
+ return 'Não pode ficar em branco'
28
+ } else {
29
+ return true
30
+ }
31
+ }
32
+
33
+ const nameOrTitle = (inpt) => {
34
+ if (!NAME_TITLE_REGEX.test(inpt)) {
35
+ return 'Não use caracteres especiais'
36
+ }
37
+ return true
38
+ }
39
+
40
+ const slug = (inpt) => {
41
+ if (!SLUG_REGEX.test(inpt)) {
42
+ return 'Não use caracteres especiais'
43
+ }
44
+ return true
45
+ }
46
+
47
+ // eslint-disable-next-line no-unused-vars
48
+ module.exports = async function create(projectName, cmdObj) {
49
+ console.log('\x1b[34mVamos criar o seu eitri-app. Para isso basta responder algumas perguntas:\x1b[0m');
50
+
51
+ try {
52
+ const url = config.get('workspace').url
53
+ workspace.setServerUrl(url)
54
+ const platform = await askProjectPlatform()
55
+ if(platform.name === ITEM_DOUBT){
56
+ handleStartServer(cmdObj, trackingService, watcher, workspace, platform.name )
57
+ return
58
+ }
59
+ const res = await askProjMetadata(platform, cmdObj, projectName)
60
+ TrackingEitriAnalytics.sendEvent({
61
+ command: "create",
62
+ success: true,
63
+ data: {
64
+ projectName,
65
+ platform
66
+ }
67
+ })
68
+ return res
69
+ } catch (e) {
70
+ await TrackingEitriAnalytics.sendEvent({
71
+ command: "create",
72
+ success: false,
73
+ errorMessage: e?.message
74
+ })
75
+ console.error(e?.message)
76
+ }
77
+ }
78
+
79
+
80
+ async function askProjectPlatform() {
81
+
82
+ const defaultTarget = await workspace.getDefaultTarget();
83
+ const availableTargets = await workspace.availableTargets() || workspace.getKnownAvailableTargets()
84
+ if(availableTargets.length <= 0) {
85
+ console.log("Sua organização não contém nenhuma aplicação disponível para prosseguir com a criação.")
86
+ process.exit(0)
87
+ }
88
+ if (!availableTargets.length) {
89
+ return defaultTarget
90
+ }
91
+ const cliOptions = [...availableTargets, { name: ITEM_DOUBT, label: 'Dúvidas? Veja documentação no browser'}]
92
+ const createLabel = (tgt) => {
93
+
94
+ let organizationLabel = tgt.organizationName || tgt.organizationId
95
+ if(tgt.organization) {
96
+ organizationLabel = tgt.organization.name || tgt.organization.id
97
+ }
98
+
99
+ return `${tgt.label || `${tgt.name} (${organizationLabel})`}`
100
+ }
101
+
102
+ const res = await inquirer.prompt([
103
+ {
104
+ name: 'accepted',
105
+ type: 'rawlist',
106
+ message: 'Selecione a aplicação para qual destina-se seu eitri-app:',
107
+ choices: cliOptions.map(createLabel)
108
+ }
109
+ ])
110
+ const target = cliOptions.find(tgt => createLabel(tgt) === res.accepted)
111
+
112
+ target.onSelected && target.onSelected()
113
+ return target
114
+ }
115
+
116
+ async function askProjMetadata(target, cmdObj, projectName) {
117
+ const factory = getCreateFactory(target.platform)
118
+ let questions = createQuestions(projectName)
119
+ try {
120
+ await workspace.init()
121
+ } catch (e) {
122
+ console.log(e.message)
123
+ return
124
+ }
125
+ let answers
126
+ if (cmdObj.yes) {
127
+ answers = {
128
+ name: projectName,
129
+ title: projectName,
130
+ slug: projectName
131
+ }
132
+ } else {
133
+ answers = await inquirer.prompt(questions)
134
+ }
135
+ let conf = {...answers, organization: {id: target.organizationId}}
136
+ delete conf.organizationName
137
+
138
+ let keepGoing = true
139
+ while (keepGoing) {
140
+ try {
141
+ keepGoing = false
142
+ await factory.verifyFolder(projectName, {supressLog: true})
143
+
144
+ // Comentado até implementarmos os múltiplos boilerplates nos targets do banco
145
+ //const {template} = cmdObj
146
+
147
+ const selectedTemplate = _getBoilerplateUrl(target, cmdObj)
148
+
149
+
150
+ cmdObj.verbose && console.log(`Usando template ${selectedTemplate}`)
151
+
152
+ let templateProject = await factory.create(projectName, selectedTemplate, target)
153
+
154
+ // conf sera usado pra escrever o arquivo miniapp.conf.js e nao queremos 'target' la.
155
+ const miniAppRequest = {...conf, target: target.name}
156
+
157
+ // Cria no banco no final das configs locais
158
+ const miniApp = await workspace.create(miniAppRequest)
159
+
160
+ conf['public-key'] = miniApp.publicKey
161
+
162
+ const templateMiniAppConf = templateProject.structure.miniAppConf
163
+
164
+ const finalConf = {
165
+ ...templateMiniAppConf,
166
+ ...conf
167
+ }
168
+
169
+ await factory.writeAmeConf(templateProject, finalConf)
170
+
171
+ } catch (err) {
172
+ if(cmdObj.verbose) {
173
+ console.error('Houve uma falha durante a criação do eitri-app', err)
174
+ }
175
+
176
+ if (err.isDuplicatedError) {
177
+ if (cmdObj.yes) {
178
+ process.exit(1)
179
+ }
180
+ if (err.field === 'name') {
181
+ keepGoing = true
182
+ conf.name = await askName(projectName)
183
+ }
184
+ if (err.field === 'slug') {
185
+ keepGoing = true
186
+ conf.slug = await askSlug(projectName)
187
+ }
188
+ } else {
189
+ if (err.isAxiosError) {
190
+ console.log(err.response && err.response.status)
191
+ } else {
192
+ console.log(err)
193
+ }
194
+ await trackingService.sendError(err)
195
+ }
196
+ }
197
+ }
198
+ }
199
+
200
+ function createQuestions(projectName) {
201
+ return [
202
+ {
203
+ type: 'input',
204
+ name: 'name',
205
+ message: 'Digite um nome legível para seu eitri-app',
206
+ validate: nameOrTitle,
207
+ default: () => {
208
+ return projectName
209
+ },
210
+ },
211
+ {
212
+ type: 'input',
213
+ name: 'title',
214
+ message: 'Digite um nome para divulgação',
215
+ validate: nameOrTitle,
216
+ default: () => {
217
+ return projectName
218
+ },
219
+ },
220
+ {
221
+ type: 'input',
222
+ name: 'slug',
223
+ message: 'Digite um nome único para seu eitri-app. Não pode conter espaços',
224
+ default: (currentAnswers) => {
225
+ return slugify(currentAnswers.name).toLowerCase()
226
+ },
227
+ validate: slug,
228
+ }
229
+ ]
230
+ }
231
+
232
+ async function askSlug(projectName) {
233
+ let answer = await inquirer.prompt([
234
+ {
235
+ type: 'input',
236
+ name: 'slug',
237
+ message: 'Outro nome único para o eitri-app:',
238
+ validate: slug,
239
+ default: () => {
240
+ return slugify(projectName).toLowerCase()
241
+ },
242
+ },
243
+ ])
244
+ return answer.slug
245
+ }
246
+
247
+ async function askName(projectName) {
248
+ let answer = await inquirer.prompt([
249
+ {
250
+ type: 'input',
251
+ name: 'name',
252
+ message: 'Outro nome para o eitri-app:',
253
+ validate: nameOrTitle,
254
+ default: () => {
255
+ return projectName
256
+ },
257
+ },
258
+ ])
259
+ return answer.name
260
+ }
261
+
262
+ /**
263
+ *
264
+ * @param {Target} target
265
+ * @param {*} cmdObj
266
+ */
267
+ function _getBoilerplateUrl(target, cmdObj) {
268
+ const {template} = cmdObj
269
+ if(!template || !target.miniAppBoilerplateList) {
270
+ return target.boilerplateUrl
271
+ }
272
+
273
+ const boilerplate = target.miniAppBoilerplateList.find(bp => bp.name === template)
274
+
275
+ if(!boilerplate) {
276
+ console.error(`O template [${template}] não existe para a aplicação que você selecionou.`)
277
+ return process.exit(0)
278
+ }
279
+
280
+ return boilerplate.boilerplateUrl
281
+ }
@@ -0,0 +1,105 @@
1
+ const path = require('path')
2
+ const { Workspace } = require('../service/Workspace')
3
+ const BlindGuardian = require('../service/BlindGuardian')
4
+ const CredentialsService = require('../service/CredentialsService')
5
+ const validator = require('./validate')
6
+ const TrackingService = require('../service/TrackingService')
7
+ const HashFolder = require('../service/HashFolder')
8
+
9
+ const blindGuardian = new BlindGuardian()
10
+ const workspace = new Workspace(blindGuardian, new HashFolder())
11
+ const credentialService = new CredentialsService(workspace)
12
+ const trackingService = new TrackingService(blindGuardian, { ignoreCredentialError: true })
13
+
14
+ const config = require('config')
15
+
16
+ const credentialStrategies = {
17
+ [credentialService.upsert.name]: credentialService.upsert,
18
+ [credentialService.createApproval.name]: credentialService.createApproval
19
+ }
20
+
21
+ async function credentials(args) {
22
+ const theFunction = credentialStrategies[credentialService.upsert.name]
23
+ await doCredentials(args, theFunction.bind(credentialService))
24
+ }
25
+
26
+ async function askForApproval(args) {
27
+ const theFunction = credentialStrategies[credentialService.createApproval.name]
28
+ await doCredentials(args, theFunction.bind(credentialService))
29
+ }
30
+
31
+ async function doCredentials(args, strategy) {
32
+ try {
33
+
34
+ if(!strategy || strategy.constructor.name !== 'AsyncFunction') {
35
+ throw new Error(`Argumento strategy é invalido: ${strategy.name}`)
36
+ }
37
+
38
+ await assertNotRunning(args)
39
+
40
+ setupBlindGuardian()
41
+
42
+ await setupWorkspace(args)
43
+
44
+ await strategy(args)
45
+
46
+ console.log('Operacao realizada com sucesso.')
47
+ } catch (e) {
48
+ if (args.verbose) {
49
+ console.log('\n')
50
+ console.error(e)
51
+ } else if (e && e.response && e.response.data) {
52
+
53
+ const { data } = e.response
54
+ if( data.friendlyMessage) {
55
+ console.error(`ERRO: ${data.friendlyMessage}`)
56
+ } else if (data.message) {
57
+ console.error(`ERRO: ${data.message}`)
58
+ } else if (data.error) {
59
+ console.error(`ERRO: status: ${e.response.status} - ${data.error}`)
60
+ } else if (e.response.status === 500) {
61
+ console.error('ERRO: Erro interno')
62
+ } else {
63
+ console.error(`ERRO: ${e.response.status} - ${e.message} - ${data.error}`)
64
+ }
65
+ } else if (e && e.message) {
66
+ console.error(`ERRO: ${e.message}`)
67
+ } else {
68
+ console.error('Erro inesperado, tente novamente mais tarde.', e)
69
+ }
70
+
71
+ await trackingService.sendError(e)
72
+ }
73
+ }
74
+
75
+ async function assertNotRunning(args) {
76
+ if (!args.force) {
77
+ await validator.assertCommandNotRunning('credentials')
78
+ }
79
+ }
80
+
81
+ function setupBlindGuardian() {
82
+ blindGuardian.readConf()
83
+ }
84
+
85
+ async function setupWorkspace(args) {
86
+ const url = config.get('workspace').url
87
+ const qrCodeUrl = config.get('qrCode').url
88
+ if (args.verbose) {
89
+ console.log('WS url', url)
90
+ console.log('qrCodeUrl url', qrCodeUrl)
91
+ }
92
+
93
+ const folder2watch = path.join(process.cwd(), 'src')
94
+ workspace.setFolder2Watch(folder2watch)
95
+ workspace.setServerUrl(url)
96
+ workspace.setQrCodeUrl(qrCodeUrl)
97
+ await workspace.init()
98
+
99
+ let publicKey = workspace.getMiniConf()['public-key']
100
+ if (!publicKey) {
101
+ throw new Error('Vc nao possui [publicKey] no arquivo de configuração do projeto.')
102
+ }
103
+ }
104
+
105
+ module.exports = { credentials, askForApproval }
@@ -0,0 +1,87 @@
1
+ const emoji = require('emojilib')
2
+ const inquirer = require('inquirer')
3
+ const path = require('path')
4
+ const {workspace} = require('../service/Workspace')
5
+ const InviteService = require('../service/InviteService')
6
+ const TrackingService = require('../service/TrackingService')
7
+ const ErrorMessages = require('../util/error-messages/error-messages')
8
+ const trackingService = new TrackingService(workspace.blindGuardian, { ignoreCredentialError: true })
9
+ const inviteService = new InviteService(workspace)
10
+
11
+ module.exports = async function invite(email, cmdObj) {
12
+ try {
13
+ const folder2watch = path.join(process.cwd(), 'src')
14
+ workspace.setFolder2Watch(folder2watch)
15
+ await workspace.init()
16
+ if (cmdObj.remove) {
17
+ let slug = workspace.getMiniConf().slug
18
+ let invites = await inviteService.findAllBySlug(slug)
19
+ let invite = invites.find(i => i.email === email)
20
+ if (!invite) {
21
+ console.log(`Convite inexistente para ${email} do miniapp ${slug}.`)
22
+ process.exit(1)
23
+ }
24
+ await inviteService.remove(invite)
25
+ console.log(`${email} removido com sucesso do miniapp ${slug}.`)
26
+ } else if (cmdObj.list) {
27
+ let slug = workspace.getMiniConf().slug
28
+ let invites = await inviteService.findAllBySlug(slug)
29
+ invites.forEach(invite => {
30
+ console.log(invite.email, '\t', invite.status)
31
+ })
32
+ } else if (cmdObj.accept) {
33
+ let invites = await inviteService.findAllPending()
34
+ if (!invites.length) {
35
+ console.log('Sem convites.')
36
+ process.exit(0)
37
+ }
38
+ console.log(`${invites.length} convites`)
39
+ const createLabel = (inv) => {
40
+ return `aceitar convite do miniapp "${inv.slug}" enviado por ${inv.inviterEmail || 'desconhecido'}`
41
+ }
42
+ let res = await inquirer.prompt([
43
+ {
44
+ name: 'accepted',
45
+ type: 'rawlist',
46
+ message: 'Escolha:',
47
+ choices: invites.map(createLabel).concat(['não aceitar nenhum convite'])
48
+ }
49
+ ])
50
+ let inviteToAccept = invites.find(inv => createLabel(inv) === res.accepted)
51
+ if (inviteToAccept) {
52
+ console.log(`Aceitando participar do miniapp ${inviteToAccept.slug}...`)
53
+ await inviteService.accept(inviteToAccept)
54
+ console.log(`Convite aceito! ${emoji.lib.clinking_glasses.char}`)
55
+ }
56
+ } else {
57
+ let slug = workspace.getMiniConf().slug
58
+ if (!email) {
59
+ console.log('Informe um email.')
60
+ process.exit(1)
61
+ }
62
+ await inviteService.sendInvite(slug, email)
63
+ console.log('Convite enviado com sucesso.')
64
+ }
65
+ process.exit(0)
66
+ } catch(e) {
67
+ if (cmdObj.verbose) {
68
+ console.log(e)
69
+ }
70
+
71
+ if (e.response) {
72
+ if(e.response.status) {
73
+ const { message } = new ErrorMessages('invite', e.response.status)
74
+ console.log(`Ops! Não foi possivel executar ação de aceite do convite\n ${message}`)
75
+ } else {
76
+ console.log(
77
+ `Ops! Houve um problema no convite\n ${e.response.data}`
78
+ )
79
+ }
80
+ } else {
81
+ console.log(`Ops! Erro enviando convite\n ${e.message}`)
82
+ }
83
+
84
+ await trackingService.sendError(e)
85
+ process.exit(1)
86
+ }
87
+ }
@@ -0,0 +1,36 @@
1
+ const inquirer = require('inquirer')
2
+ const TargetService = require('../service/TargetService')
3
+ const {workspace} = require('../service/Workspace')
4
+ const targetService = new TargetService(workspace)
5
+
6
+ module.exports = async function list(args) {
7
+ try {
8
+ const targets = await targetService.getTargets()
9
+ if(targets.length === 0) {
10
+ console.error('Houve um erro ao listar os targets.')
11
+ return process.exit(0)
12
+ }
13
+ const res = await inquirer.prompt([
14
+ {
15
+ name: 'selected',
16
+ type: 'rawlist',
17
+ message: 'Selecione o Target em que deseja ver os templates:',
18
+ choices: targets
19
+ }
20
+ ])
21
+
22
+ const selectedTarget = targets.find(tg => tg.name === res.selected)
23
+
24
+ if(args.template){
25
+ const boilerplates = selectedTarget.miniAppBoilerplateList
26
+ if(!boilerplates) {
27
+ console.error(`O Target ${selectedTarget.name} não possui boilerplates disponíveis.`)
28
+ return process.exit(0)
29
+ }
30
+ boilerplates.map( boilerplate => console.log(`${boilerplate.name}: ${boilerplate.description} \n`))
31
+ }
32
+ } catch (error) {
33
+ console.error('Houve um erro ao listar os targets.')
34
+ return process.exit(0)
35
+ }
36
+ }
@@ -0,0 +1,51 @@
1
+ const inquirer = require('inquirer')
2
+ const config = require('config')
3
+ const open = require('open')
4
+ const TrackingEitriAnalytics = require('../service/TrackingEitriAnalytics')
5
+ const Server = require('../service/Server')
6
+
7
+ module.exports = async function login(args) {
8
+ try {
9
+ console.log("==========================================\n\n")
10
+
11
+ const {openPortalAnwser} = await inquirer.prompt([
12
+ {
13
+ type: 'confirm',
14
+ name: 'openPortalAnwser',
15
+ message: ' Podemos guiá-lo até o nosso sagrado portal?',
16
+ },
17
+ ])
18
+
19
+ const urlAdminManagerCredential = `${config.get("managerFront").url}${config.get("managerFront").cliGenerateLoginCredential}`
20
+ const res = Server.startCliLogin()
21
+ const urlAdminManagerCredentialWithParams = `${urlAdminManagerCredential}?cli_login=true&redirect_url=http://${res?.host}:${res?.port}/cli-login`
22
+ let portalOpenMessage = ""
23
+
24
+
25
+ if (openPortalAnwser) {
26
+ console.log("\n", "Abrindo o portal...")
27
+ try {
28
+ open(urlAdminManagerCredentialWithParams)
29
+ portalOpenMessage = "Portal aberto em seu navegador padrão"
30
+ } catch (error) {
31
+ portalOpenMessage = "Não foi possível abrir o portal. Você terá que fazer isso dessa vez. Copie o link e cole em seu navegador para fazer o login na Eitri CLI. " + urlAdminManagerCredentialWithParams
32
+ }
33
+ } else {
34
+ portalOpenMessage = "Copie o link e cole em seu navegador para fazer o login na Eitri CLI. " + urlAdminManagerCredentialWithParams
35
+ }
36
+
37
+ console.log("\n", portalOpenMessage)
38
+ console.log("\n\n Aguardando pela autenticação...")
39
+ } catch (error) {
40
+ await TrackingEitriAnalytics.sendEvent({
41
+ command: "login",
42
+ success: false,
43
+ errorMessage: error?.message
44
+ })
45
+
46
+ console.log('Erro inesperado, tente novamente mais tarde.', error?.message)
47
+
48
+ process.exit(1)
49
+ }
50
+
51
+ }
@@ -0,0 +1,129 @@
1
+ const path = require('path')
2
+ const config = require('config')
3
+
4
+ const { workspace } = require('../service/Workspace')
5
+ const MiniLog = require('../service/MiniLog')
6
+ const {
7
+ buildEnvFile,
8
+ environmentVariable,
9
+ panicCheckEnvList,
10
+ sendEnvfile,
11
+ getEnvName,
12
+ } = require('../util/manage-env')
13
+
14
+ const ManageEnvService = require('../service/ManageEnvService')
15
+ const manageEnvService = new ManageEnvService()
16
+
17
+ const blindGuardian = workspace.blindGuardian
18
+ const CONFIG_WORKSPACE = config.get('workspace')
19
+
20
+ module.exports = async function manageEnv(envList, cmd) {
21
+ try {
22
+ if (cmd.read) getEnv(cmd)
23
+ else setEnv(envList, cmd)
24
+ } catch (e) {
25
+ console.log(e.message)
26
+ if (cmd.verbose) {
27
+ console.log(e)
28
+ }
29
+ process.exit(1)
30
+ }
31
+ }
32
+
33
+ const getEnv = async (cmd) => {
34
+ const miniLog = new MiniLog(config.get('miniLog'))
35
+ const folder2watch = path.join(process.cwd(), 'src')
36
+
37
+ workspace.setFolder2Watch(folder2watch)
38
+ blindGuardian.readConf()
39
+
40
+ workspace.setServerUrl(CONFIG_WORKSPACE.url)
41
+ await workspace.init()
42
+ await miniLog.connect(workspace.userEmail)
43
+ const miniConf = workspace.getMiniConf()
44
+ const envName = getEnvName(cmd)
45
+ const fileNames = await workspace.getFileNames('server')
46
+
47
+ try {
48
+ const envVariables = await manageEnvService.getEnvVariables(
49
+ workspace,
50
+ CONFIG_WORKSPACE.colossus.url,
51
+ miniConf,
52
+ envName,
53
+ workspace.userEmail,
54
+ fileNames[0]
55
+ )
56
+ delete envVariables.greeting
57
+ delete envVariables.warning
58
+
59
+ console.log(JSON.stringify(envVariables, null, 4))
60
+ } catch (error) {
61
+ if (cmd.verbose) {
62
+ console.log(error)
63
+ } else {
64
+ console.log(error.message)
65
+ }
66
+ } finally {
67
+ process.exit(0)
68
+ }
69
+ }
70
+
71
+ const setEnv = async (envList, cmd) => {
72
+ try {
73
+ panicCheckEnvList(envList)
74
+ const environmentVariables = environmentVariable(envList)
75
+ const miniLog = new MiniLog(config.get('miniLog'))
76
+ const folder2watch = path.join(process.cwd(), 'src')
77
+
78
+ workspace.setFolder2Watch(folder2watch)
79
+ blindGuardian.readConf()
80
+
81
+ workspace.setServerUrl(CONFIG_WORKSPACE.url)
82
+ await workspace.init()
83
+ await miniLog.connect(workspace.userEmail)
84
+ let miniConf = workspace.getMiniConf()
85
+ const fileNames = await workspace.getFileNames('server')
86
+ let envName = getEnvName(cmd)
87
+ let envFile = buildEnvFile(
88
+ envName,
89
+ fileNames,
90
+ environmentVariables,
91
+ miniConf.slug,
92
+ miniConf.version
93
+ )
94
+
95
+ if (cmd.verbose) {
96
+ console.log(
97
+ `Enviando env ${
98
+ CONFIG_WORKSPACE.colossus.url
99
+ }\n${JSON.stringify(envFile, null, 4)}`
100
+ )
101
+ }
102
+
103
+ const result = await sendEnvfile(
104
+ workspace,
105
+ `${CONFIG_WORKSPACE.colossus.url}`,
106
+ envFile
107
+ )
108
+ if (result.statusText.toLowerCase() === 'ok') {
109
+ console.log('As variaveis de ambiente foram criadas com sucesso.')
110
+ }
111
+ } catch (error) {
112
+ if (cmd.verbose) {
113
+ console.error('manageEnv.setEnv.fail', error)
114
+ } else {
115
+ if (error.isAxiosError) {
116
+ if (error.response) {
117
+ const data = error.response.data || { error: error.message }
118
+ console.error('manageEnv.setEnv.apiError', data.error)
119
+ } else {
120
+ console.error('manageEnv.setEnv.connectionError', error.message)
121
+ }
122
+ } else {
123
+ console.error('manageEnv.setEnv.internalError', error)
124
+ }
125
+ }
126
+ } finally {
127
+ process.exit(0)
128
+ }
129
+ }
@@ -0,0 +1,6 @@
1
+ const start = require('./start')
2
+
3
+ module.exports = async function openShare(shareId, cmdObj) {
4
+ let args = {...cmdObj, shareId: shareId}
5
+ await start(args)
6
+ }