eitri-cli 1.3.0-beta.2 → 1.3.0-beta.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eitri-cli",
3
- "version": "1.3.0-beta.2",
3
+ "version": "1.3.0-beta.4",
4
4
  "description": "Command Line Interface to make \"Eitri-App\" with code and fire.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -86,22 +86,14 @@ ${await targetService.getAppConfExampleSnippet()}
86
86
  const userWorkspace = await getWorkspace()
87
87
  await miniLog.connect(userWorkspace.id)
88
88
  console.log(separator)
89
- console.log('Analisando versões')
89
+ console.log("Analisando versões...");
90
90
 
91
- // Verificar se precisamos dessa parte
92
- const {target} = await workspace.checkVersions()
93
- // const {addedPermissions, removedPermissions} = await workspace.comparePermissions(target)
94
- // await logPermissionsAndOpenPrompt(addedPermissions, removedPermissions, cmdObj)
95
- // console.log(separator)
91
+ const { target } = await workspace.checkVersions();
96
92
 
97
- console.log('Preparando os arquivos do seu Eitri-App')
98
-
99
- await workspace.uploadAll()
100
- const webhooks = workspace.getWebhooks()
101
- printAvailableWebhooks(webhooks)
102
- console.log('')
103
- console.log(separator)
104
- console.log('Gerando Eitri-App')
93
+ console.log("\nPreparando os arquivos do seu Eitri-App...");
94
+ await workspace.uploadZip();
95
+ console.log(separator);
96
+ console.log("Gerando versão do Eitri-App");
105
97
 
106
98
  const start = Date.now()
107
99
  let pushVersionPromise = miniLog.awaitForPushVersion()
package/src/cmd/start.js CHANGED
@@ -74,14 +74,17 @@ module.exports = async function start(args) {
74
74
  const userWorkspace = await getWorkspace()
75
75
  await miniLog.connect(userWorkspace.id, silentOnConnect)
76
76
 
77
- if (args.unzip) {
78
- await workspace.uploadAll(args)
79
- } else {
80
- await workspace.uploadZip(args)
81
- }
77
+ console.log("Construindo...");
78
+ await workspace.uploadZip(args);
79
+ console.log("Pronto!");
80
+
82
81
  const loadedTarget = await workspace.getTarget()
83
82
  const platform = loadedTarget.platform
84
- await handleStartServer(args, trackingService, watcher, workspace, target, targetConfig, platform)
83
+ const argsWithDeeplinks = {
84
+ ...args,
85
+ deepLinks: loadedTarget?.deepLinks || []
86
+ }
87
+ await handleStartServer(argsWithDeeplinks, trackingService, watcher, workspace, target, targetConfig, platform)
85
88
 
86
89
  TrackingEitriAnalytics.sendEvent({
87
90
  eventName:"start",
@@ -24,7 +24,7 @@ async function handleStartServer(args, trackingService, watcher, workspace, fact
24
24
  }
25
25
 
26
26
 
27
- const starter = factory.create(args, trackingService, watcher, workspace, targetConfig)
27
+ const starter = await factory.create(args, trackingService, watcher, workspace, targetConfig)
28
28
  await starter.startServer()
29
29
  }
30
30
 
@@ -475,14 +475,7 @@ class Workspace {
475
475
  return !isValidFileName;
476
476
  }
477
477
 
478
- async upsert(filesPath, opts = {}, showProgressBar = false) {
479
- if (showProgressBar) {
480
- return await this.upsertConcurrency(
481
- filesPath,
482
- opts,
483
- showProgressBar
484
- );
485
- }
478
+ async upsert(filesPath, opts = {}) {
486
479
  return await this.upsertSequencial(filesPath, opts);
487
480
  }
488
481
 
@@ -512,54 +505,6 @@ class Workspace {
512
505
  return holder.promise;
513
506
  }
514
507
 
515
- async upsertConcurrency(filesPath, opts = {}, showProgressBar = false) {
516
- const promises = [];
517
- const isSaving = opts.why === WatcherOpts.SAVE;
518
- if (showProgressBar) {
519
- this.createProgressBar(showProgressBar);
520
- this.progressBar.start(filesPath.length, 0);
521
- this.progressBar.update(this.progressBarCounter);
522
- }
523
-
524
- for (const filePath of filesPath) {
525
- const fileName = path.basename(filePath);
526
-
527
- const { isInvalid, promise } = await this.validateFileName(
528
- fileName,
529
- filePath
530
- );
531
- if (isInvalid) return await promise;
532
-
533
- const upsertFile = {
534
- filePath,
535
- opts,
536
- requestNumber: this.requestNumber++,
537
- };
538
- promises.push(
539
- this.execUpsertConcurrency(
540
- upsertFile,
541
- isSaving,
542
- showProgressBar
543
- )
544
- );
545
- }
546
-
547
- const promisesChunks = this.spliceArray(promises, 5);
548
- const data = [];
549
- for (const promiseArray of promisesChunks) {
550
- const result = await Promise.all(promiseArray);
551
- data.push(...result);
552
- }
553
-
554
- if (isSaving) return data[0];
555
-
556
- if (showProgressBar) {
557
- this.progressBar.update(filesPath.length);
558
- this.progressBar.stop();
559
- }
560
- return data;
561
- }
562
-
563
508
  async postFile(filePath, isSaving, opts) {
564
509
  const start = new Date().getTime();
565
510
  const relativePath = this.getRelativePath(filePath);
@@ -584,29 +529,6 @@ class Workspace {
584
529
  fileName,
585
530
  };
586
531
  }
587
-
588
- async execUpsertConcurrency(upsertFile, isSaving, showProgressBar = false) {
589
- const { filePath, opts, requestNumber } = upsertFile;
590
-
591
- const { fileName, relativePath, start } = await this.postFile(
592
- filePath,
593
- isSaving,
594
- opts
595
- );
596
-
597
- if (showProgressBar) {
598
- this.progressBarCounter++;
599
- this.progressBar.update(this.progressBarCounter);
600
- }
601
- return {
602
- filePath,
603
- relativePath,
604
- requestNumber,
605
- time: new Date().getTime() - start,
606
- baseName: fileName,
607
- };
608
- }
609
-
610
532
  async execUpsertSequencial(isSaving) {
611
533
  this.uploading = true;
612
534
  for (let i = 0; i < this.upsertQueue.length; i++) {
@@ -792,37 +714,6 @@ class Workspace {
792
714
  return allFiles;
793
715
  }
794
716
 
795
- async uploadAll() {
796
- await this.mkdirs([this.folder2watch, ...this.resourceFolders2watch]);
797
- await this.rmAllServerFiles();
798
- await this.hashFolder.updateHashFile();
799
-
800
- const srcFiles = await this.listFilesInCorrectOrder();
801
- const filesfromSrc = srcFiles.filter((f) => !f.endsWith("folder.hash"));
802
- const srcFolderHash = srcFiles.filter((f) => f.endsWith("folder.hash"));
803
-
804
- const resourceFiles = await this.getAllResourceFiles(
805
- this.resourceFolders2watch
806
- );
807
-
808
- let files = resourceFiles.concat(filesfromSrc);
809
- const componentFiles = files.filter((file) =>
810
- file.includes("/components")
811
- );
812
-
813
- const opts = {
814
- why: "save",
815
- log: false,
816
- skipCompile: true,
817
- };
818
- const showProgressBar = true;
819
- if (componentFiles && componentFiles.length > 0) {
820
- await this.preUpsert(componentFiles, opts);
821
- }
822
- await this.upsert(files, opts, showProgressBar);
823
- await this.transpile(srcFolderHash);
824
- }
825
-
826
717
  async preUpsert(componentsFiles, opts) {
827
718
  for (const filePath of componentsFiles) {
828
719
  await this.upsertSequencial(filePath, opts);
@@ -869,8 +760,6 @@ class Workspace {
869
760
  );
870
761
  admZip.addLocalFolder("./src");
871
762
 
872
- console.log("Construindo");
873
-
874
763
  const platform = process.platform;
875
764
 
876
765
  const zipPath = await this.resolveOs(platform);
@@ -878,8 +767,6 @@ class Workspace {
878
767
  await this.sendZip(zipPath);
879
768
 
880
769
  await this.transpile(folderHash);
881
-
882
- console.log("Pronto");
883
770
  }
884
771
 
885
772
  async resolveOs(platform) {
@@ -1156,37 +1043,6 @@ class Workspace {
1156
1043
  toBase64(content) {
1157
1044
  return Buffer.from(content).toString("base64");
1158
1045
  }
1159
-
1160
- createProgressBar(showProgressBar) {
1161
- if (showProgressBar) {
1162
- this.progressBar = new cliProgress.SingleBar(
1163
- {
1164
- format: "Sincronizando [{bar}] {percentage}% | ETA: {eta}s | {value}/{total} Arquivos sincronizados...",
1165
- },
1166
- cliProgress.Presets.shades_classic
1167
- );
1168
- }
1169
- }
1170
-
1171
- /**
1172
- *
1173
- * @param {unknown[]} array
1174
- * @param {number} chunkCount
1175
- * @returns {unknown[][]}
1176
- */
1177
- spliceArray(array, chunkCount) {
1178
- var chunks = [],
1179
- iterator,
1180
- auxiliar;
1181
- for (
1182
- iterator = 0, auxiliar = array.length;
1183
- iterator < auxiliar;
1184
- iterator += chunkCount
1185
- ) {
1186
- chunks.push(array.slice(iterator, iterator + chunkCount));
1187
- }
1188
- return chunks;
1189
- }
1190
1046
  }
1191
1047
 
1192
1048
  module.exports = {
@@ -3,6 +3,7 @@ const { Ios, Android } = require("uri-scheme");
3
3
  const readline = require("readline");
4
4
  const chalk = require("chalk");
5
5
  const os = require("os");
6
+
6
7
  function QRCodeStarter(
7
8
  args,
8
9
  trackingService,
@@ -56,35 +57,51 @@ function QRCodeStarter(
56
57
  _QRCodeFactory.generate({ ...this.args, qrCodePath, fullUrl });
57
58
 
58
59
  if (this.args.emulator) {
59
- tryOpenEmulator(fullUrl, args);
60
+ await tryOpenEmulator(fullUrl, args);
60
61
  }
61
62
 
62
- listenerKeyPressToOpenEmulator(fullUrl);
63
+ await listenerKeyPressToOpenEmulator(fullUrl, args.deepLinks);
63
64
  };
64
65
  }
65
66
 
66
- function tryOpenEmulator(fullUrl, args) {
67
+ async function tryOpenEmulator(fullUrl, args) {
67
68
  const shareId = extractShareId(fullUrl);
68
- const { emulator } = args;
69
- if (emulator === "ios") {
70
- return Ios.openAsync({ uri: `eitri://workspace/${shareId}` }).catch(
71
- () => {
72
- console.error(
73
- `Houve um erro ao tentar abrir o Eitri-App na plataforma iOS`
74
- );
69
+ const { emulator, deepLinks } = args;
70
+ if(!deepLinks || deepLinks?.length < 1) {
71
+ console.log("Seu application não contém deep links configurados.")
72
+ return
73
+ };
74
+
75
+ let opened = false
76
+ for await (const deepLink of deepLinks) {
77
+ if(opened) return
78
+ try {
79
+ if (emulator === "ios") {
80
+ Ios.openAsync({ uri: `${deepLink}/${shareId}` })
81
+ .then(() => {opened = true})
82
+ .catch(() => {
83
+ opened = false;
84
+ console.log(`Houve um erro ao tentar abrir o Eitri-App na plataforma iOS`)
85
+ })
86
+ } else {
87
+ Android.openAsync({ uri: `${deepLink}/${shareId}` })
88
+ .then(() => {opened = true})
89
+ .catch(() => {
90
+ opened = false;
91
+ console.log(`Houve um erro ao tentar abrir o Eitri-App na plataforma Android`)
92
+ })
75
93
  }
76
- );
77
- }
78
- return Android.openAsync({ uri: `eitri://workspace/${shareId}` }).catch(
79
- () => {
94
+ } catch (error) {
80
95
  console.error(
81
- `Houve um erro ao tentar abrir o Eitri-App na plataforma Android`
96
+ `Houve um erro ao tentar abrir o Eitri-App na plataforma ${emulator}`
82
97
  );
83
98
  }
84
- );
99
+ }
100
+
85
101
  }
86
102
 
87
- function listenerKeyPressToOpenEmulator(url) {
103
+ async function listenerKeyPressToOpenEmulator(url, deepLinks) {
104
+ if(!deepLinks || deepLinks?.length < 1) return;
88
105
  const enterText = chalk.blue.bold("Enter");
89
106
  console.log("================================================");
90
107
  console.log(`\t${chalk.green.bold("Abertura de Eitri-App automática")}`);
@@ -104,20 +121,16 @@ function listenerKeyPressToOpenEmulator(url) {
104
121
  console.log("================================================");
105
122
  readline.emitKeypressEvents(process.stdin);
106
123
 
107
- process.stdin.on("keypress", (chunk, key) => {
124
+ process.stdin.on("keypress", async (chunk, key) => {
108
125
  if (key && key.name == "a") {
109
126
  const emulator = "android";
110
127
  console.log(`Abrindo Eitri-App no ${chalk.blue.bold("Android")}`);
111
- tryOpenEmulator(url, { emulator });
128
+ await tryOpenEmulator(url, { emulator, deepLinks });
112
129
  }
113
130
  if (os.platform() === "darwin" && key && key.name == "i") {
114
131
  const emulator = "ios";
115
132
  console.log(`Abrindo Eitri-App no ${chalk.blue.bold("iOS")}`);
116
- tryOpenEmulator(url, { emulator });
117
- }
118
- if (key && key.name == "q") {
119
- console.log("Parando execução do Eitri-App");
120
- process.exit(0);
133
+ await tryOpenEmulator(url, { emulator, deepLinks });
121
134
  }
122
135
  });
123
136
  }
@@ -7,6 +7,8 @@ const minutes = 60000;
7
7
  const Executor = require("../Executor.js");
8
8
  const Helper = require("../Helper.js");
9
9
  const ConfigService = require("../../src/service/ConfigService.js");
10
+ const Http = require("../../src/service/Http.js");
11
+ const BlindGuardian = require("../../src/service/BlindGuardian.js");
10
12
 
11
13
  describe("eitri-cli", () => {
12
14
  const EITRI_WORK_DIR = path.join(__dirname, "..", "..", "developer-folder");
@@ -137,6 +139,67 @@ describe("eitri-cli", () => {
137
139
  }
138
140
  });
139
141
 
142
+ it(
143
+ "should do push-version",
144
+ async () => {
145
+ const EITRI_APP_NAME = `eitri-test-${Date.now()}`;
146
+ try {
147
+ await execAsync(
148
+ `cd ${EITRI_WORK_DIR} && rm -rf ./eitri-test-*`,
149
+ { env: process.env }
150
+ );
151
+
152
+ const executor = new Executor({ env: devEnv });
153
+ await executor
154
+ .exec(
155
+ `cd ${EITRI_WORK_DIR} && eitri create ${EITRI_APP_NAME} --yes --application=APPLICATION_CALINDRA`,
156
+ { env: devEnv }
157
+ )
158
+ .waitFor(/Download de template completo/);
159
+ await new Promise((resolve) => setTimeout(resolve, 200));
160
+ const EITRI_APP_FOLDER = path.resolve(
161
+ EITRI_WORK_DIR,
162
+ EITRI_APP_NAME
163
+ );
164
+ const startExecution = new Executor({ env: devEnv });
165
+ await startExecution
166
+ .exec(`cd ${EITRI_APP_FOLDER} && eitri start`)
167
+ .waitFor(/Utilize o QR-Code para iniciar o seu Eitri-App/);
168
+ executor.child.kill();
169
+ startExecution.child.kill();
170
+
171
+ const pushVersion = new Executor({ env: devEnv });
172
+ await pushVersion
173
+ .exec(`cd ${EITRI_APP_FOLDER} && eitri push-version`)
174
+ .waitFor(/disponível no Eitri Console/);
175
+ pushVersion.child.kill();
176
+
177
+ const conf = require(`../../developer-folder/${EITRI_APP_NAME}/eitri-app.conf.js`);
178
+ const data = await getPublishedVersion(conf.version, conf.id);
179
+
180
+ expect(data.length).toBe(1);
181
+ expect(data[0].version).toBe(conf.version);
182
+ expect(data[0].eitriAppId).toBe(conf.id);
183
+
184
+ await Helper.delete(conf.id);
185
+ } catch (e) {
186
+ console.error(e);
187
+ throw e;
188
+ }
189
+ },
190
+ 2 * minutes
191
+ );
192
+
193
+ const getPublishedVersion = async (version, eitriAppId) => {
194
+ const blindGuardian = new BlindGuardian();
195
+ const http = new Http(blindGuardian);
196
+
197
+ const url = `https://api.eitri.tech/eitri-manager-api/revisions?eitriAppId=${eitriAppId}&version=${version}`;
198
+
199
+ const data = await http.get(url);
200
+ return data;
201
+ };
202
+
140
203
  const sleep = (timeInMs) => {
141
204
  return new Promise((resolve) => setTimeout(resolve, timeInMs));
142
205
  };