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.
- package/README.md +54 -0
- package/bitbucket-pipelines.toBeChanged.yml +64 -0
- package/boilerplate/mini-app-cafe-madeira.zip +0 -0
- package/check-version.js +12 -0
- package/config/default-eitri.js +1 -0
- package/config/dev.js +91 -0
- package/config/k8s-eitri.js +92 -0
- package/config/loc-eitri.js +92 -0
- package/config/prod-eitri.js +92 -0
- package/config/test-eitri.js +2 -0
- package/index-eitri.js +6 -0
- package/index.js +182 -0
- package/install-dev.bat +1 -0
- package/install-dev.sh +1 -0
- package/jest.config.js +6 -0
- package/jsconfig.json +9 -0
- package/package.json +80 -0
- package/publisher.js +53 -0
- package/src/cmd/clean.js +179 -0
- package/src/cmd/create.js +281 -0
- package/src/cmd/credentials.js +105 -0
- package/src/cmd/invite.js +87 -0
- package/src/cmd/list.js +36 -0
- package/src/cmd/login.js +51 -0
- package/src/cmd/manage-env.js +129 -0
- package/src/cmd/open-share.js +6 -0
- package/src/cmd/order-details.js +6 -0
- package/src/cmd/push-version.js +182 -0
- package/src/cmd/show-message-if-outdated-package.js +32 -0
- package/src/cmd/signup.js +69 -0
- package/src/cmd/start.js +171 -0
- package/src/cmd/tail-logs.js +26 -0
- package/src/cmd/test-initialization-params.js +6 -0
- package/src/cmd/validate.js +170 -0
- package/src/cmd/version.js +29 -0
- package/src/enum/WatcherOpts.js +3 -0
- package/src/enum/target.js +6 -0
- package/src/helpers/request-listener-helper.js +55 -0
- package/src/model/Payload.js +45 -0
- package/src/model/Target.js +76 -0
- package/src/model/User.js +11 -0
- package/src/service/AuthConfig.js +88 -0
- package/src/service/BlindGuardian.js +134 -0
- package/src/service/CliLogin.js +47 -0
- package/src/service/ConfigService.js +16 -0
- package/src/service/CredentialsService.js +47 -0
- package/src/service/GATrackingStrategy.js +16 -0
- package/src/service/HashFolder.js +79 -0
- package/src/service/Http.js +234 -0
- package/src/service/InviteService.js +45 -0
- package/src/service/ManageEnvService.js +10 -0
- package/src/service/MiniLog.js +132 -0
- package/src/service/QRCodeFactory.js +43 -0
- package/src/service/Server.js +239 -0
- package/src/service/StarterService.js +31 -0
- package/src/service/TagTree.js +101 -0
- package/src/service/TargetService.js +97 -0
- package/src/service/TrackService.js +11 -0
- package/src/service/TrackingEitriAnalytics.js +32 -0
- package/src/service/TrackingService.js +183 -0
- package/src/service/ValidateResult.js +57 -0
- package/src/service/Watcher.js +119 -0
- package/src/service/Workspace.js +1069 -0
- package/src/service/WorkspaceManager.js +74 -0
- package/src/service/factories/DoubtsStarterFactory.js +25 -0
- package/src/service/factories/MiniWebAppFactory.js +43 -0
- package/src/service/factories/QRCodeStarterFactory.js +78 -0
- package/src/service/factories/WebStarterFactory.js +88 -0
- package/src/service/factories/WoodCoffeeFactory.js +230 -0
- package/src/util/AboutTemplate.jsx +14 -0
- package/src/util/UrlUtils.js +12 -0
- package/src/util/UserLocalCredential.js +122 -0
- package/src/util/error-messages/error-messages.js +24 -0
- package/src/util/error-messages/invite/invite-error-messages.js +14 -0
- package/src/util/getCliVersion.js +13 -0
- package/src/util/getCreateFactory.js +9 -0
- package/src/util/ipv4.js +19 -0
- package/src/util/manage-env.js +65 -0
- package/src/util/open-docs.js +7 -0
- package/src/util/os.js +39 -0
- package/src/util/server-url.js +15 -0
- package/src/util/template-utils.js +21 -0
- package/src/view/index.html +19 -0
- package/targetMobileStickyness.md +47 -0
- package/targetWebStickyness.md +40 -0
- package/test/_fixtures/factory.js +30 -0
- package/test/_fixtures/miniWebApp/miniapp.conf.js +4 -0
- package/test/_fixtures/miniapp.conf.js +5 -0
- package/test/_fixtures/server/HelloWorldBackend.js +7 -0
- package/test/_fixtures/src/Home.js +5 -0
- package/test/_fixtures/src/Home2.js +5 -0
- package/test/_fixtures/src/commons/util.js +3 -0
- package/test/_fixtures/src/components/TagA.jsx +4 -0
- package/test/_fixtures/src/components/TagB.jsx +4 -0
- package/test/_fixtures/src/components/TagC.jsx +3 -0
- package/test/_fixtures/src/components/TagD.jsx +3 -0
- package/test/_fixtures/src/server/foo.js +7 -0
- package/test/_fixtures/src/views/AboutTemplate.jsx +14 -0
- package/test/_fixtures/woodcoffee/miniapp.conf.js +3 -0
- package/test/ame.conf.js +3 -0
- package/test/cmd/clean.test.js +66 -0
- package/test/cmd/create.test.js +252 -0
- package/test/cmd/credentials.test.js +159 -0
- package/test/cmd/list.test.js +74 -0
- package/test/cmd/manage-env.test.js +168 -0
- package/test/cmd/signup.test.js +20 -0
- package/test/cmd/start.test.js +5 -0
- package/test/miniapp.conf.js +3 -0
- package/test/model/Payload.test.js +35 -0
- package/test/service/BlindGuardian.test.js +84 -0
- package/test/service/CheckAmeConf.test.js +313 -0
- package/test/service/Http.test.js +312 -0
- package/test/service/InviteService.test.js +117 -0
- package/test/service/MiniWebAppFactory.test.js +40 -0
- package/test/service/TagTree.test.js +81 -0
- package/test/service/TargetService.test.js +48 -0
- package/test/service/TrackingService.test.js +105 -0
- package/test/service/UserAmeConf.test.js +47 -0
- package/test/service/WoodCoffeeFactory.test.js +148 -0
- package/test/service/Workspace.test.js +364 -0
- package/thinQrCode.md +58 -0
- 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
|
+
}
|
package/src/cmd/list.js
ADDED
|
@@ -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
|
+
}
|
package/src/cmd/login.js
ADDED
|
@@ -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
|
+
}
|