xs-dev 0.0.1 → 0.1.0

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 CHANGED
@@ -211,3 +211,19 @@ xs-dev remove network/wifi
211
211
  ```
212
212
 
213
213
  Updates the `manifest.json` to remove the dependency.
214
+
215
+ ## Development
216
+
217
+ Clone the project and install dependencies. We're using [pnpm](https://pnpm.io/) and [volta](https://volta.sh/) to manage packages and Node.
218
+
219
+ ```
220
+ git clone https://github.com/HipsterBrown/xs-dev.git
221
+ cd xs-dev
222
+ pnpm install
223
+ ```
224
+
225
+ Link dev version of CLI:
226
+
227
+ ```
228
+ pnpm link .
229
+ ```
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../toolbox/setup/constants");
4
+ const command = {
5
+ name: 'teardown',
6
+ description: 'Remove all installed git repos and toolchains, unset environment changes',
7
+ run: async ({ print, filesystem, patching }) => {
8
+ const spinner = print.spin();
9
+ spinner.start('Tearing down Moddable tools and platform dependencies');
10
+ filesystem.remove(constants_1.EXPORTS_FILE_PATH);
11
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'moddable'));
12
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'wasm'));
13
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'esp32'));
14
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'esp8266'));
15
+ await patching.patch(constants_1.PROFILE_PATH, {
16
+ delete: `source ${constants_1.EXPORTS_FILE_PATH}`,
17
+ });
18
+ spinner.succeed(`Clean up complete!`);
19
+ },
20
+ };
21
+ exports.default = command;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhcmRvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvdGVhcmRvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwwREFJbUM7QUFFbkMsTUFBTSxPQUFPLEdBQW1CO0lBQzlCLElBQUksRUFBRSxVQUFVO0lBQ2hCLFdBQVcsRUFDVCwwRUFBMEU7SUFDNUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUM3QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO1FBRXRFLFVBQVUsQ0FBQyxNQUFNLENBQUMsNkJBQWlCLENBQUMsQ0FBQTtRQUNwQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzlELFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDMUQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBRTdELE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyx3QkFBWSxFQUFFO1lBQ2pDLE1BQU0sRUFBRSxVQUFVLDZCQUFpQixFQUFFO1NBQ3RDLENBQUMsQ0FBQTtRQUVGLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.PROFILE_PATH = exports.PROFILE = exports.INSTALL_PATH = exports.INSTALL_DIR = exports.HOME_DIR = void 0;
4
+ exports.EXPORTS_FILE_PATH = exports.PROFILE_PATH = exports.PROFILE = exports.INSTALL_PATH = exports.INSTALL_DIR = exports.HOME_DIR = void 0;
5
5
  const gluegun_1 = require("gluegun");
6
6
  exports.HOME_DIR = gluegun_1.filesystem.homedir();
7
7
  exports.INSTALL_DIR = gluegun_1.filesystem.resolve(exports.HOME_DIR, '.local', 'share');
@@ -16,4 +16,5 @@ exports.PROFILE = (function () {
16
16
  return '.profile';
17
17
  })();
18
18
  exports.PROFILE_PATH = gluegun_1.filesystem.resolve(exports.HOME_DIR, exports.PROFILE);
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxQ0FBb0M7QUFFdkIsUUFBQSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUMvQixRQUFBLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM3RCxRQUFBLFlBQVksR0FDdkIsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUN4RCxRQUFBLE9BQU8sR0FBRyxDQUFDOztJQUN0QixNQUFNLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUE7SUFDckMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQzFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUM1QyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ1MsUUFBQSxZQUFZLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsRUFBRSxlQUFPLENBQUMsQ0FBQSJ9
19
+ exports.EXPORTS_FILE_PATH = gluegun_1.filesystem.resolve(exports.HOME_DIR, '.local', 'share', 'xs-dev-export.sh');
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxQ0FBb0M7QUFFdkIsUUFBQSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUMvQixRQUFBLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM3RCxRQUFBLFlBQVksR0FDdkIsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUN4RCxRQUFBLE9BQU8sR0FBRyxDQUFDOztJQUN0QixNQUFNLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUE7SUFDckMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQzFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUM1QyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ1MsUUFBQSxZQUFZLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsRUFBRSxlQUFPLENBQUMsQ0FBQTtBQUNwRCxRQUFBLGlCQUFpQixHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNqRCxnQkFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1Asa0JBQWtCLENBQ25CLENBQUEifQ==
@@ -11,64 +11,75 @@ async function default_1() {
11
11
  const ESP_BRANCH = 'v4.3.1';
12
12
  const ESP32_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'esp32');
13
13
  const IDF_PATH = gluegun_1.filesystem.resolve(ESP32_DIR, 'esp-idf');
14
- gluegun_1.print.info('Setting up esp32 tools');
14
+ const spinner = gluegun_1.print.spin();
15
+ spinner.start('Setting up esp32 tools');
15
16
  // 0. ensure Moddable exists
16
17
  if (process.env.MODDABLE === undefined) {
17
- gluegun_1.print.warning('Moddable tooling required. Run `xs-dev setup` before trying again.');
18
+ spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
18
19
  process.exit(1);
19
20
  }
20
21
  // 1. ensure ~/.local/share/esp32 directory
21
- gluegun_1.print.info('Ensuring esp32 install directory');
22
+ spinner.info('Ensuring esp32 install directory');
22
23
  gluegun_1.filesystem.dir(ESP32_DIR);
24
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH);
23
25
  // 2. clone esp-idf into ~/.local/share/esp32/esp-idf
24
26
  if (gluegun_1.filesystem.exists(IDF_PATH) === false) {
25
- gluegun_1.print.info('Cloning esp-idf repo');
27
+ spinner.start('Cloning esp-idf repo');
26
28
  await gluegun_1.system.spawn(`git clone -b ${ESP_BRANCH} --recursive ${ESP_IDF_REPO} ${IDF_PATH}`);
29
+ spinner.succeed();
27
30
  }
28
31
  // 3. brew install python3, cmake, ninja, dfu-util
29
- gluegun_1.print.info('Installing build dependencies: python, cmake, ninja, dfu-util');
32
+ spinner.start('Installing build dependencies: python, cmake, ninja, dfu-util');
30
33
  if (gluegun_1.system.which('python') === null ||
31
34
  // get python verion, check if v3
32
35
  gluegun_1.semver.satisfies((await gluegun_1.system.exec('python --version', { trim: true }))
33
36
  .toString()
34
37
  .split(' ')
35
38
  .pop(), '>= 3.x.x')) {
36
- await gluegun_1.system.spawn('brew install python');
39
+ await gluegun_1.system.exec('brew install python');
37
40
  }
38
41
  if (gluegun_1.system.which('cmake') === null) {
39
- await gluegun_1.system.spawn('brew install cmake');
42
+ await gluegun_1.system.exec('brew install cmake');
40
43
  }
41
44
  if (gluegun_1.system.which('ninja') === null) {
42
- await gluegun_1.system.spawn('brew install ninja');
45
+ await gluegun_1.system.exec('brew install ninja');
43
46
  }
44
47
  if (gluegun_1.system.which('dfu-util') === null) {
45
- await gluegun_1.system.spawn('brew install dfu-util');
48
+ await gluegun_1.system.exec('brew install dfu-util');
46
49
  }
47
50
  // 4. install pip, if needed
48
51
  if (gluegun_1.system.which('pip3') === null) {
49
- gluegun_1.print.info('Installing pip3');
50
- await gluegun_1.system.spawn('python3 -m ensurepip --user');
52
+ spinner.start('Installing pip3');
53
+ await gluegun_1.system.exec('python3 -m ensurepip --user');
51
54
  }
52
55
  // 5. pip install pyserial, if needed
53
- gluegun_1.print.info('Installing pyserial through pip3');
54
- await gluegun_1.system.spawn('python3 -m pip install pyserial');
56
+ spinner.start('Installing pyserial through pip3');
57
+ await gluegun_1.system.exec('python3 -m pip install pyserial');
55
58
  // 6. append IDF_PATH env export to shell profile
56
59
  if (process.env.IDF_PATH === undefined) {
57
- gluegun_1.print.info('Configuring $IDF_PATH');
60
+ spinner.info('Configuring $IDF_PATH');
58
61
  process.env.IDF_PATH = IDF_PATH;
59
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export IDF_PATH=${IDF_PATH}`);
62
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export IDF_PATH=${IDF_PATH}`);
60
63
  }
61
64
  // 7. cd to IDF_PATH, run install.sh
62
- gluegun_1.print.info('Installing esp-idf tooling');
63
- await gluegun_1.system.spawn('./install.sh', { cwd: IDF_PATH });
65
+ spinner.start('Installing esp-idf tooling');
66
+ await gluegun_1.system.exec('./install.sh', {
67
+ cwd: IDF_PATH,
68
+ shell: process.env.SHELL,
69
+ stdout: process.stdout,
70
+ });
71
+ spinner.succeed();
64
72
  // 8. append 'source $IDF_PATH/export.sh' to shell profile
65
- gluegun_1.print.info('Sourcing esp-idf environment');
66
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `source $IDF_PATH/export.sh`);
67
- gluegun_1.print.success(`
73
+ spinner.info('Sourcing esp-idf environment');
74
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `source $IDF_PATH/export.sh`);
75
+ await gluegun_1.system.exec('source $IDF_PATH/export.sh', {
76
+ shell: process.env.SHELL,
77
+ });
78
+ spinner.succeed(`
68
79
  Successfully set up esp32 platform support for Moddable!
69
- Test out the setup by plugging in your device and running: xs-dev run --example helloworld --device=esp32
80
+ Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device=esp32
70
81
  If there is trouble finding the correct port, pass the "--port" flag to the above command with the path to the "/dev.cu.*" that matches your device.
71
82
  `);
72
83
  }
73
84
  exports.default = default_1;
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwMzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3AzMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUEyRDtBQUMzRCwyQ0FBdUQ7QUFDdkQsZ0VBQXVDO0FBRXhCLEtBQUs7SUFDbEIsTUFBTSxZQUFZLEdBQUcsMENBQTBDLENBQUE7SUFDL0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFBO0lBQzNCLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDMUQsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3pELGVBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUVwQyw0QkFBNEI7SUFDNUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDdEMsZUFBSyxDQUFDLE9BQU8sQ0FDWCxvRUFBb0UsQ0FDckUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCwyQ0FBMkM7SUFDM0MsZUFBSyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO0lBQzlDLG9CQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRXpCLHFEQUFxRDtJQUNyRCxJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUN6QyxlQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFDbEMsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FDaEIsZ0JBQWdCLFVBQVUsZ0JBQWdCLFlBQVksSUFBSSxRQUFRLEVBQUUsQ0FDckUsQ0FBQTtLQUNGO0lBRUQsa0RBQWtEO0lBQ2xELGVBQUssQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQTtJQUUzRSxJQUNFLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUk7UUFDL0IsaUNBQWlDO1FBQ2pDLGdCQUFNLENBQUMsU0FBUyxDQUNkLENBQUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3BELFFBQVEsRUFBRTthQUNWLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLEVBQUUsRUFDUixVQUFVLENBQ1gsRUFDRDtRQUNBLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtLQUMxQztJQUVELElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2xDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtLQUN6QztJQUVELElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2xDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtLQUN6QztJQUVELElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3JDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtLQUM1QztJQUVELDRCQUE0QjtJQUM1QixJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQyxlQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDN0IsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0tBQ2xEO0lBRUQscUNBQXFDO0lBQ3JDLGVBQUssQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUM5QyxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7SUFFckQsaURBQWlEO0lBQ2pELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDL0IsTUFBTSxJQUFBLGdCQUFNLEVBQUMsd0JBQVksRUFBRSxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUMxRDtJQUVELG9DQUFvQztJQUNwQyxlQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUE7SUFDeEMsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUVyRCwwREFBMEQ7SUFDMUQsZUFBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sSUFBQSxnQkFBTSxFQUFDLHdCQUFZLEVBQUUsNEJBQTRCLENBQUMsQ0FBQTtJQUV4RCxlQUFLLENBQUMsT0FBTyxDQUFDOzs7O0dBSWIsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQXRGRCw0QkFzRkMifQ==
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwMzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3AzMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUEyRDtBQUMzRCwyQ0FBNEQ7QUFDNUQsZ0VBQXVDO0FBRXhCLEtBQUs7SUFDbEIsTUFBTSxZQUFZLEdBQUcsMENBQTBDLENBQUE7SUFDL0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFBO0lBQzNCLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDMUQsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRXpELE1BQU0sT0FBTyxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7SUFFdkMsNEJBQTRCO0lBQzVCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysb0VBQW9FLENBQ3JFLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsMkNBQTJDO0lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUNoRCxvQkFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN6QixvQkFBVSxDQUFDLElBQUksQ0FBQyw2QkFBaUIsQ0FBQyxDQUFBO0lBRWxDLHFEQUFxRDtJQUNyRCxJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFDckMsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FDaEIsZ0JBQWdCLFVBQVUsZ0JBQWdCLFlBQVksSUFBSSxRQUFRLEVBQUUsQ0FDckUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtLQUNsQjtJQUVELGtEQUFrRDtJQUNsRCxPQUFPLENBQUMsS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUE7SUFFOUUsSUFDRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJO1FBQy9CLGlDQUFpQztRQUNqQyxnQkFBTSxDQUFDLFNBQVMsQ0FDZCxDQUFDLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNwRCxRQUFRLEVBQUU7YUFDVixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxFQUFFLEVBQ1IsVUFBVSxDQUNYLEVBQ0Q7UUFDQSxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7S0FDekM7SUFFRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7S0FDeEM7SUFFRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7S0FDeEM7SUFFRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNyQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUE7S0FDM0M7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtLQUNqRDtJQUVELHFDQUFxQztJQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7SUFDakQsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO0lBRXBELGlEQUFpRDtJQUNqRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQy9CLE1BQU0sSUFBQSxnQkFBTSxFQUFDLDZCQUFpQixFQUFFLG1CQUFtQixRQUFRLEVBQUUsQ0FBQyxDQUFBO0tBQy9EO0lBRUQsb0NBQW9DO0lBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtJQUMzQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtRQUNoQyxHQUFHLEVBQUUsUUFBUTtRQUNiLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUs7UUFDeEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ3ZCLENBQUMsQ0FBQTtJQUNGLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqQiwwREFBMEQ7SUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sSUFBQSxnQkFBTSxFQUFDLDZCQUFpQixFQUFFLDRCQUE0QixDQUFDLENBQUE7SUFDN0QsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtRQUM5QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLO0tBQ3pCLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxPQUFPLENBQUM7Ozs7R0FJZixDQUFDLENBQUE7QUFDSixDQUFDO0FBbEdELDRCQWtHQyJ9
@@ -5,12 +5,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const gluegun_1 = require("gluegun");
7
7
  const axios_1 = __importDefault(require("axios"));
8
- const promises_1 = require("stream/promises");
8
+ const stream_1 = require("stream");
9
+ const util_1 = require("util");
9
10
  const tar_fs_1 = require("tar-fs");
10
11
  const zlib_1 = require("zlib");
11
12
  const unzip_stream_1 = require("unzip-stream");
12
13
  const constants_1 = require("./constants");
13
14
  const upsert_1 = __importDefault(require("../patching/upsert"));
15
+ const finishedPromise = (0, util_1.promisify)(stream_1.finished);
14
16
  async function default_1() {
15
17
  const TOOLCHAIN = 'https://www.moddable.com/private/esp8266.toolchain.darwin.tgz';
16
18
  const ARDUINO_CORE = 'https://github.com/esp8266/Arduino/releases/download/2.3.0/esp8266-2.3.0.zip';
@@ -20,18 +22,19 @@ async function default_1() {
20
22
  const RTOS_PATH = gluegun_1.filesystem.resolve(ESP_DIR, 'ESP8266_RTOS_SDK');
21
23
  const TOOLCHAIN_PATH = gluegun_1.filesystem.resolve(ESP_DIR, 'toolchain');
22
24
  const ARDUINO_CORE_PATH = gluegun_1.filesystem.resolve(ESP_DIR, 'esp8266-2.3.0');
23
- gluegun_1.print.info('Setting up esp8266 tools');
25
+ const spinner = gluegun_1.print.spin();
26
+ spinner.start('Setting up esp8266 tools');
24
27
  // 0. ensure Moddable exists
25
28
  if (process.env.MODDABLE === undefined) {
26
- gluegun_1.print.warning('Moddable tooling required. Run `xs-dev setup` before trying again.');
29
+ spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
27
30
  process.exit(1);
28
31
  }
29
32
  // 1. ensure ~/.local/share/esp directory
30
- gluegun_1.print.info('Ensuring esp directory');
33
+ spinner.info('Ensuring esp directory');
31
34
  gluegun_1.filesystem.dir(ESP_DIR);
35
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH);
32
36
  // 2. download and untar xtensa toolchain
33
37
  if (gluegun_1.filesystem.exists(TOOLCHAIN_PATH) === false) {
34
- const spinner = gluegun_1.print.spin();
35
38
  spinner.start('Downloading xtensa toolchain');
36
39
  const writer = (0, tar_fs_1.extract)(ESP_DIR, { readable: true });
37
40
  const gunzip = (0, zlib_1.createGunzip)();
@@ -39,48 +42,51 @@ async function default_1() {
39
42
  responseType: 'stream',
40
43
  });
41
44
  response.data.pipe(gunzip).pipe(writer);
42
- await (0, promises_1.finished)(writer);
45
+ await finishedPromise(writer);
43
46
  spinner.succeed();
44
47
  }
45
48
  // 3. download and unzip esp8266 core for arduino
46
49
  if (gluegun_1.filesystem.exists(ARDUINO_CORE_PATH) === false) {
47
- const spinner = gluegun_1.print.spin();
48
50
  spinner.start('Downloading arduino core tooling');
49
51
  const writer = (0, unzip_stream_1.Extract)({ path: ESP_DIR });
50
52
  const response = await axios_1.default.get(ARDUINO_CORE, {
51
53
  responseType: 'stream',
52
54
  });
53
55
  response.data.pipe(writer);
54
- await (0, promises_1.finished)(writer);
56
+ await finishedPromise(writer);
55
57
  spinner.succeed();
56
58
  }
57
59
  // 4. clone esp8266 RTOS SDK
58
60
  if (gluegun_1.filesystem.exists(RTOS_PATH) === false) {
59
- gluegun_1.print.info('Cloning esp8266 RTOS SDK repo');
61
+ spinner.start('Cloning esp8266 RTOS SDK repo');
60
62
  await gluegun_1.system.spawn(`git clone -b ${ESP_BRANCH} ${ESP_RTOS_REPO} ${RTOS_PATH}`);
63
+ spinner.succeed();
61
64
  }
62
65
  // 5. ensure python, pip, and pyserial are installed
63
66
  if (gluegun_1.system.which('python') === null) {
64
- gluegun_1.print.info('Installing python from homebrew');
65
- await gluegun_1.system.spawn('brew install python');
67
+ spinner.start('Installing python from homebrew');
68
+ await gluegun_1.system.exec('brew install python');
69
+ spinner.succeed();
66
70
  }
67
71
  if (gluegun_1.system.which('pip') === null) {
68
- gluegun_1.print.info('Installing pip through easy_install');
69
- await gluegun_1.system.spawn('sudo easy_install pip');
72
+ spinner.start('Installing pip through ensurepip');
73
+ await gluegun_1.system.exec('python -m ensurepip');
74
+ spinner.succeed();
70
75
  }
71
- gluegun_1.print.info('Installing pyserial through pip');
72
- await gluegun_1.system.spawn('python -m pip install pyserial');
76
+ spinner.start('Installing pyserial through pip');
77
+ await gluegun_1.system.exec('python -m pip install pyserial');
78
+ spinner.succeed();
73
79
  // 7. create ESP_BARE env export in shell profile
74
80
  if (process.env.ESP_BASE === undefined) {
75
- gluegun_1.print.info('Configuring $ESP_BASE');
81
+ spinner.info('Configuring $ESP_BASE');
76
82
  process.env.ESP_BASE = ESP_DIR;
77
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export ESP_BASE=${process.env.ESP_BASE}`);
83
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export ESP_BASE=${process.env.ESP_BASE}`);
78
84
  }
79
- gluegun_1.print.success(`
85
+ spinner.succeed(`
80
86
  Successfully set up esp8266 platform support for moddable!
81
- Test out the setup by plugging in your device and running: xs-dev run --example helloworld --device esp8266
87
+ Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device esp8266
82
88
  If there is trouble finding the correct port, pass the "--port" flag to the above command with the path to the "/dev.cu.*" that matches your device.
83
89
  `);
84
90
  }
85
91
  exports.default = default_1;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwODI2Ni5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDgyNjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQXlCO0FBQ3pCLDhDQUEwQztBQUMxQyxtQ0FBZ0M7QUFDaEMsK0JBQW1DO0FBQ25DLCtDQUFvRDtBQUNwRCwyQ0FBdUQ7QUFDdkQsZ0VBQXVDO0FBRXhCLEtBQUs7SUFDbEIsTUFBTSxTQUFTLEdBQ2IsK0RBQStELENBQUE7SUFDakUsTUFBTSxZQUFZLEdBQ2hCLDhFQUE4RSxDQUFBO0lBQ2hGLE1BQU0sYUFBYSxHQUFHLG1EQUFtRCxDQUFBO0lBQ3pFLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQTtJQUNqQyxNQUFNLE9BQU8sR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3RELE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sY0FBYyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUV0RSxlQUFLLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFFdEMsNEJBQTRCO0lBQzVCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxPQUFPLENBQ1gsb0VBQW9FLENBQ3JFLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQseUNBQXlDO0lBQ3pDLGVBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUNwQyxvQkFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUV2Qix5Q0FBeUM7SUFDekMsSUFBSSxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDL0MsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFPLEVBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBQSxtQkFBWSxHQUFFLENBQUE7UUFDN0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUMxQyxZQUFZLEVBQUUsUUFBUTtTQUN2QixDQUFDLENBQUE7UUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdkMsTUFBTSxJQUFBLG1CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUE7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0tBQ2xCO0lBRUQsaURBQWlEO0lBQ2pELElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHNCQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUM1QyxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFO1lBQzdDLFlBQVksRUFBRSxRQUFRO1NBQ3ZCLENBQUMsQ0FBQTtRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzFCLE1BQU0sSUFBQSxtQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3RCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtLQUNsQjtJQUVELDRCQUE0QjtJQUM1QixJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUMxQyxlQUFLLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDM0MsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FDaEIsZ0JBQWdCLFVBQVUsSUFBSSxhQUFhLElBQUksU0FBUyxFQUFFLENBQzNELENBQUE7S0FDRjtJQUVELG9EQUFvRDtJQUNwRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNuQyxlQUFLLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDN0MsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0tBQzFDO0lBRUQsSUFBSSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDaEMsZUFBSyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtLQUM1QztJQUVELGVBQUssQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUM3QyxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7SUFFcEQsaURBQWlEO0lBQ2pELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7UUFDOUIsTUFBTSxJQUFBLGdCQUFNLEVBQUMsd0JBQVksRUFBRSxtQkFBbUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0tBQ3RFO0lBRUQsZUFBSyxDQUFDLE9BQU8sQ0FBQzs7OztHQUliLENBQUMsQ0FBQTtBQUNKLENBQUM7QUF2RkQsNEJBdUZDIn0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwODI2Ni5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDgyNjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQXlCO0FBQ3pCLG1DQUFpQztBQUNqQywrQkFBZ0M7QUFDaEMsbUNBQWdDO0FBQ2hDLCtCQUFtQztBQUNuQywrQ0FBb0Q7QUFDcEQsMkNBQTREO0FBQzVELGdFQUF1QztBQUV2QyxNQUFNLGVBQWUsR0FBRyxJQUFBLGdCQUFTLEVBQUMsaUJBQVEsQ0FBQyxDQUFBO0FBRTVCLEtBQUs7SUFDbEIsTUFBTSxTQUFTLEdBQ2IsK0RBQStELENBQUE7SUFDakUsTUFBTSxZQUFZLEdBQ2hCLDhFQUE4RSxDQUFBO0lBQ2hGLE1BQU0sYUFBYSxHQUFHLG1EQUFtRCxDQUFBO0lBQ3pFLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQTtJQUNqQyxNQUFNLE9BQU8sR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3RELE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sY0FBYyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUV0RSxNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBRXpDLDRCQUE0QjtJQUM1QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLG9FQUFvRSxD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
@@ -13,29 +13,33 @@ async function default_1() {
13
13
  const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'mac');
14
14
  // 0. ensure xcode command line tools are available (?)
15
15
  try {
16
- await gluegun_1.system.spawn('xcode-select -p');
16
+ await gluegun_1.system.exec('xcode-select -p');
17
17
  }
18
18
  catch (error) {
19
19
  gluegun_1.print.error('Xcode command line tools are required to build the SDK: https://developer.apple.com/xcode/');
20
20
  process.exit(1);
21
21
  }
22
+ const spinner = gluegun_1.print.spin();
23
+ spinner.start('Beginning setup...');
22
24
  // 1. clone moddable repo into ./local/share directory if it does not exist yet
23
25
  try {
24
26
  gluegun_1.filesystem.dir(constants_1.INSTALL_DIR);
25
27
  }
26
28
  catch (error) {
27
- gluegun_1.print.error(`Error setting up install directory: ${String(error)}`);
29
+ spinner.fail(`Error setting up install directory: ${String(error)}`);
28
30
  process.exit(1);
29
31
  }
30
32
  if (gluegun_1.filesystem.exists(constants_1.INSTALL_PATH) !== false) {
31
- gluegun_1.print.info('Moddable repo already installed');
33
+ spinner.info('Moddable repo already installed');
32
34
  }
33
35
  else {
34
36
  try {
37
+ spinner.start('Cloning Moddable-OpenSource/moddable repo');
35
38
  await gluegun_1.system.spawn(`git clone ${MODDABLE_REPO} ${constants_1.INSTALL_PATH}`);
39
+ spinner.succeed();
36
40
  }
37
41
  catch (error) {
38
- gluegun_1.print.error(`Error cloning moddable repo: ${String(error)}`);
42
+ spinner.fail(`Error cloning moddable repo: ${String(error)}`);
39
43
  process.exit(1);
40
44
  }
41
45
  }
@@ -43,19 +47,24 @@ async function default_1() {
43
47
  if (process.env.MODDABLE === undefined) {
44
48
  process.env.MODDABLE = constants_1.INSTALL_PATH;
45
49
  process.env.PATH = `${String(process.env.PATH)}:${BIN_PATH}`;
46
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export MODDABLE=${process.env.MODDABLE}`);
47
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export PATH="${BIN_PATH}:$PATH"`);
50
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH, {
51
+ content: `# Generated by xs-dev CLI\n`,
52
+ });
53
+ await (0, upsert_1.default)(constants_1.PROFILE_PATH, `source ${constants_1.EXPORTS_FILE_PATH}`);
54
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export MODDABLE=${process.env.MODDABLE}`);
55
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export PATH="${BIN_PATH}:$PATH"`);
48
56
  }
49
57
  else {
50
- gluegun_1.print.info(`Using current MODDABLE env: ${process.env.MODDABLE}`);
58
+ spinner.info(`Using current MODDABLE env: ${process.env.MODDABLE}`);
51
59
  }
52
60
  // 3. cd into makefiles dir for platform, run `make`
53
61
  try {
54
- const dir = gluegun_1.filesystem.cwd(gluegun_1.filesystem.resolve(BUILD_DIR));
55
- await gluegun_1.system.spawn('make', { cwd: dir.cwd() });
62
+ spinner.start('Building platform tooling');
63
+ await gluegun_1.system.exec('make', { cwd: BUILD_DIR });
64
+ spinner.succeed();
56
65
  }
57
66
  catch (error) {
58
- gluegun_1.print.error(`Error building mac tooling: ${String(error)}`);
67
+ spinner.fail(`Error building mac tooling: ${String(error)}`);
59
68
  process.exit(1);
60
69
  }
61
70
  // 4. symlink xsbug.app into user applications directory
@@ -64,14 +73,14 @@ async function default_1() {
64
73
  }
65
74
  catch (error) {
66
75
  if (!String(error).includes('exists')) {
67
- gluegun_1.print.error(`Issue creating symlink for xsbug.app: ${String(error)}`);
76
+ spinner.fail(`Issue creating symlink for xsbug.app: ${String(error)}`);
68
77
  process.exit(1);
69
78
  }
70
79
  else {
71
- gluegun_1.print.info('xsbug.app symlink already exists');
80
+ spinner.info('xsbug.app symlink already exists');
72
81
  }
73
82
  }
74
- gluegun_1.print.success('Moddable SDK successfully set up! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
83
+ spinner.succeed('Moddable SDK successfully set up! Start a new terminal session and run the "helloworld example": xs-dev run --example helloworld');
75
84
  }
76
85
  exports.default = default_1;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvbWFjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUNBQW1EO0FBQ25ELDJDQUFxRTtBQUNyRSxnRUFBdUM7QUFFeEIsS0FBSztJQUNsQixlQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDdkMsTUFBTSxhQUFhLEdBQUcsaURBQWlELENBQUE7SUFFdkUsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQ2pDLHdCQUFZLEVBQ1osT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUE7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FDbEMsd0JBQVksRUFDWixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTixDQUFBO0lBRUQsdURBQXVEO0lBQ3ZELElBQUk7UUFDRixNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUE7S0FDdEM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLGVBQUssQ0FBQyxLQUFLLENBQ1QsNEZBQTRGLENBQzdGLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsK0VBQStFO0lBQy9FLElBQUk7UUFDRixvQkFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBVyxDQUFDLENBQUE7S0FDNUI7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLGVBQUssQ0FBQyxLQUFLLENBQUMsdUNBQXVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsd0JBQVksQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUM3QyxlQUFLLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7S0FDOUM7U0FBTTtRQUNMLElBQUk7WUFDRixNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsYUFBYSxJQUFJLHdCQUFZLEVBQUUsQ0FBQyxDQUFBO1NBQ2pFO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxlQUFLLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDaEI7S0FDRjtJQUVELHVFQUF1RTtJQUN2RSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyx3QkFBWSxDQUFBO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUE7UUFFNUQsTUFBTSxJQUFBLGdCQUFNLEVBQUMsd0JBQVksRUFBRSxtQkFBbUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sSUFBQSxnQkFBTSxFQUFDLHdCQUFZLEVBQUUsZ0JBQWdCLFFBQVEsU0FBUyxDQUFDLENBQUE7S0FDOUQ7U0FBTTtRQUNMLGVBQUssQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUNsRTtJQUVELG9EQUFvRDtJQUNwRCxJQUFJO1FBQ0YsTUFBTSxHQUFHLEdBQUcsb0JBQVUsQ0FBQyxHQUFHLENBQUMsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUN6RCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0tBQy9DO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxlQUFLLENBQUMsS0FBSyxDQUFDLCtCQUErQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCx3REFBd0Q7SUFDeEQsSUFBSTtRQUNGLG9CQUFVLENBQUMsT0FBTyxDQUNoQixvQkFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQ3pDLHlCQUF5QixDQUMxQixDQUFBO0tBQ0Y7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLGVBQUssQ0FBQyxLQUFLLENBQUMseUNBQXlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUNoQjthQUFNO1lBQ0wsZUFBSyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1NBQy9DO0tBQ0Y7SUFFRCxlQUFLLENBQUMsT0FBTyxDQUNYLHlIQUF5SCxDQUMxSCxDQUFBO0FBQ0gsQ0FBQztBQXJGRCw0QkFxRkMifQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvbWFjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUNBQW1EO0FBQ25ELDJDQUtvQjtBQUNwQixnRUFBdUM7QUFFeEIsS0FBSztJQUNsQixlQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDdkMsTUFBTSxhQUFhLEdBQUcsaURBQWlELENBQUE7SUFFdkUsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQ2pDLHdCQUFZLEVBQ1osT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUE7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FDbEMsd0JBQVksRUFDWixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTixDQUFBO0lBRUQsdURBQXVEO0lBQ3ZELElBQUk7UUFDRixNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7S0FDckM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLGVBQUssQ0FBQyxLQUFLLENBQ1QsNEZBQTRGLENBQzdGLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUVuQywrRUFBK0U7SUFDL0UsSUFBSTtRQUNGLG9CQUFVLENBQUMsR0FBRyxDQUFDLHVCQUFXLENBQUMsQ0FBQTtLQUM1QjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsSUFBSSxvQkFBVSxDQUFDLE1BQU0sQ0FBQyx3QkFBWSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtLQUNoRDtTQUFNO1FBQ0wsSUFBSTtZQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtZQUMxRCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsYUFBYSxJQUFJLHdCQUFZLEVBQUUsQ0FBQyxDQUFBO1lBQ2hFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtTQUNsQjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUM3RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO0tBQ0Y7SUFFRCx1RUFBdUU7SUFDdkUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsd0JBQVksQ0FBQTtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFBO1FBRTVELG9CQUFVLENBQUMsSUFBSSxDQUFDLDZCQUFpQixFQUFFO1lBQ2pDLE9BQU8sRUFBRSw2QkFBNkI7U0FDdkMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxJQUFBLGdCQUFNLEVBQUMsd0JBQVksRUFBRSxVQUFVLDZCQUFpQixFQUFFLENBQUMsQ0FBQTtRQUV6RCxNQUFNLElBQUEsZ0JBQU0sRUFBQyw2QkFBaUIsRUFBRSxtQkFBbUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQzFFLE1BQU0sSUFBQSxnQkFBTSxFQUFDLDZCQUFpQixFQUFFLGdCQUFnQixRQUFRLFNBQVMsQ0FBQyxDQUFBO0tBQ25FO1NBQU07UUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7S0FDcEU7SUFFRCxvREFBb0Q7SUFDcEQsSUFBSTtRQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtRQUMxQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQzdDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtLQUNsQjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsd0RBQXdEO0lBQ3hELElBQUk7UUFDRixvQkFBVSxDQUFDLE9BQU8sQ0FDaEIsb0JBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUN6Qyx5QkFBeUIsQ0FDMUIsQ0FBQTtLQUNGO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDaEI7YUFBTTtZQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtTQUNqRDtLQUNGO0lBRUQsT0FBTyxDQUFDLE9BQU8sQ0FDYixrSUFBa0ksQ0FDbkksQ0FBQTtBQUNILENBQUM7QUFoR0QsNEJBZ0dDIn0=
@@ -12,54 +12,77 @@ async function default_1() {
12
12
  const WASM_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'wasm');
13
13
  const EMSDK_PATH = gluegun_1.filesystem.resolve(WASM_DIR, 'emsdk');
14
14
  const BINARYEN_PATH = gluegun_1.filesystem.resolve(WASM_DIR, 'binaryen');
15
- gluegun_1.print.info('Setting up wasm simulator tools');
15
+ const spinner = gluegun_1.print.spin({ stream: process.stdout });
16
+ spinner.start('Setting up wasm simulator tools');
16
17
  // 0. ensure wasm instal directory and Moddable exists
17
18
  if (process.env.MODDABLE === undefined) {
18
- gluegun_1.print.warning('Moddable tooling required. Run `xs-dev setup` before trying again.');
19
+ spinner.fail('Moddable platform tooling required. Run `xs-dev setup` before trying again.');
19
20
  process.exit(1);
20
21
  }
21
- gluegun_1.print.info('Ensuring wasm directory');
22
+ spinner.info('Ensuring wasm directory');
22
23
  gluegun_1.filesystem.dir(WASM_DIR);
23
24
  // 1. Clone EM_SDK repo, install, and activate latest version
24
25
  if (gluegun_1.filesystem.exists(EMSDK_PATH) === false) {
25
- gluegun_1.print.info('Cloning emsdk repo');
26
+ spinner.start('Cloning emsdk repo');
26
27
  try {
27
28
  await gluegun_1.system.spawn(`git clone ${EMSDK_REPO} ${EMSDK_PATH}`);
28
- await gluegun_1.system.spawn('./emsdk install latest', {
29
+ spinner.start('Installing latest EMSDK');
30
+ await gluegun_1.system.exec('./emsdk install latest', {
29
31
  cwd: EMSDK_PATH,
32
+ stdout: process.stdout,
30
33
  });
31
- await gluegun_1.system.spawn('./emsdk activate latest', {
34
+ await gluegun_1.system.exec('./emsdk activate latest', {
32
35
  cwd: EMSDK_PATH,
36
+ stdout: process.stdout,
33
37
  });
34
38
  }
35
39
  catch (error) {
36
- gluegun_1.print.error(`Error activating emsdk: ${String(error)}`);
40
+ spinner.fail(`Error activating emsdk: ${String(error)}`);
37
41
  process.exit(1);
38
42
  }
39
43
  }
44
+ spinner.succeed('emsdk setup complete');
40
45
  // 2. Clone Binaryen repo and build
41
46
  if (gluegun_1.filesystem.exists(BINARYEN_PATH) === false) {
42
- gluegun_1.print.info('Cloning binaryen repo');
47
+ spinner.start('Cloning binaryen repo');
43
48
  await gluegun_1.system.spawn(`git clone ${BINARYEN_REPO} ${BINARYEN_PATH}`);
49
+ spinner.info('Binaryen repo cloned');
44
50
  if (gluegun_1.system.which('cmake') === null) {
45
- gluegun_1.print.info('Cmake required, installing with Homebrew');
46
- await gluegun_1.system.spawn('brew install cmake');
51
+ spinner.start('Cmake required, installing with Homebrew');
52
+ await gluegun_1.system.exec('brew install cmake');
47
53
  }
48
- await gluegun_1.system.spawn('cmake . && make', {
54
+ spinner.start('Building Binaryen tooling');
55
+ await gluegun_1.system.exec('cmake .', {
49
56
  cwd: BINARYEN_PATH,
57
+ stdout: process.stdout,
50
58
  });
59
+ spinner.succeed('cmake complete');
60
+ spinner.start('Start make process, this could take a couple minutes');
61
+ await gluegun_1.system.exec('make', {
62
+ cwd: BINARYEN_PATH,
63
+ stdout: process.stdout,
64
+ });
65
+ spinner.succeed();
51
66
  }
52
67
  // 3. Setup PATH and env variables for EM_SDK and Binaryen
53
- gluegun_1.print.info('Sourcing emsdk environment and adding binaryen to PATH');
54
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `source ${gluegun_1.filesystem.resolve(EMSDK_PATH, 'emsdk_env.sh')}`);
55
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export PATH=${gluegun_1.filesystem.resolve(BINARYEN_PATH, 'bin')}:$PATH`);
68
+ spinner.info('Sourcing emsdk environment and adding binaryen to PATH');
69
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH);
70
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `source ${gluegun_1.filesystem.resolve(EMSDK_PATH, 'emsdk_env.sh')}`);
71
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export PATH=${gluegun_1.filesystem.resolve(BINARYEN_PATH, 'bin')}:$PATH`);
56
72
  process.env.PATH = `${String(process.env.PATH)}:${gluegun_1.filesystem.resolve(BINARYEN_PATH, 'bin')}`;
57
73
  // 4. Build Moddable WASM tools
58
- gluegun_1.print.info('Building Moddable wasm tools');
59
- await gluegun_1.system.spawn(`make`, {
60
- cwd: gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'makefiles', 'wasm'),
74
+ if (gluegun_1.filesystem.exists(gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'bin', 'wasm')) === false) {
75
+ spinner.start('Building Moddable wasm tools');
76
+ await gluegun_1.system.exec(`make`, {
77
+ cwd: gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'makefiles', 'wasm'),
78
+ stdout: process.stdout,
79
+ });
80
+ }
81
+ await gluegun_1.system.exec(`source ${constants_1.EXPORTS_FILE_PATH}`, {
82
+ shell: process.env.SHELL,
83
+ stdout: process.stdout,
61
84
  });
62
- gluegun_1.print.success(`Successfully set up wasm platform support for Moddable! Test out the setup by plugging in your device and running: xs-dev run --example helloworld --device wasm`);
85
+ spinner.succeed(`Successfully set up wasm platform support for Moddable! Test out the setup by starting a new terminal session and running: xs-dev run --example helloworld --device wasm`);
63
86
  }
64
87
  exports.default = default_1;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsMkNBQXVEO0FBQ3ZELGdFQUF1QztBQUV4QixLQUFLO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLDhDQUE4QyxDQUFBO0lBQ2pFLE1BQU0sYUFBYSxHQUFHLDZDQUE2QyxDQUFBO0lBQ25FLE1BQU0sUUFBUSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDeEQsTUFBTSxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sYUFBYSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUU5RCxlQUFLLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7SUFFN0Msc0RBQXNEO0lBQ3RELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxPQUFPLENBQ1gsb0VBQW9FLENBQ3JFLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBQ0QsZUFBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO0lBQ3JDLG9CQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXhCLDZEQUE2RDtJQUM3RCxJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUMzQyxlQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDaEMsSUFBSTtZQUNGLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxVQUFVLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUMzRCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO2dCQUMzQyxHQUFHLEVBQUUsVUFBVTthQUNoQixDQUFDLENBQUE7WUFDRixNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFO2dCQUM1QyxHQUFHLEVBQUUsVUFBVTthQUNoQixDQUFDLENBQUE7U0FDSDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsZUFBSyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO0tBQ0Y7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDOUMsZUFBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ25DLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxhQUFhLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUVqRSxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsQyxlQUFLLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUE7WUFDdEQsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1NBQ3pDO1FBRUQsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQyxHQUFHLEVBQUUsYUFBYTtTQUNuQixDQUFDLENBQUE7S0FDSDtJQUVELDBEQUEwRDtJQUMxRCxlQUFLLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxDQUFDLENBQUE7SUFDcEUsTUFBTSxJQUFBLGdCQUFNLEVBQ1Ysd0JBQVksRUFDWixVQUFVLG9CQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUMzRCxDQUFBO0lBQ0QsTUFBTSxJQUFBLGdCQUFNLEVBQ1Ysd0JBQVksRUFDWixlQUFlLG9CQUFVLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUNoRSxDQUFBO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBVSxDQUFDLE9BQU8sQ0FDbEUsYUFBYSxFQUNiLEtBQUssQ0FDTixFQUFFLENBQUE7SUFFSCwrQkFBK0I7SUFDL0IsZUFBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ3pCLEdBQUcsRUFBRSxvQkFBVSxDQUFDLE9BQU8sQ0FDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQzVCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsTUFBTSxDQUNQO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsZUFBSyxDQUFDLE9BQU8sQ0FDWCxrS0FBa0ssQ0FDbkssQ0FBQTtBQUNILENBQUM7QUFoRkQsNEJBZ0ZDIn0=
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsMkNBQTREO0FBQzVELGdFQUF1QztBQUV4QixLQUFLO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLDhDQUE4QyxDQUFBO0lBQ2pFLE1BQU0sYUFBYSxHQUFHLDZDQUE2QyxDQUFBO0lBQ25FLE1BQU0sUUFBUSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDeEQsTUFBTSxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sYUFBYSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUU5RCxNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUVoRCxzREFBc0Q7SUFDdEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDViw2RUFBNkUsQ0FDOUUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUE7SUFDdkMsb0JBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFeEIsNkRBQTZEO0lBQzdELElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQzNDLE9BQU8sQ0FBQyxLQUFLLENB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
@@ -13,15 +13,16 @@ async function default_1() {
13
13
  }
14
14
  const spinner = gluegun_1.print.spin();
15
15
  spinner.start('Updating Moddable SDK!');
16
- spinner.info('Stashing any unsaved changes before committing');
16
+ spinner.start('Stashing any unsaved changes before committing');
17
17
  await gluegun_1.system.exec('git stash', { cwd: process.env.MODDABLE });
18
18
  await gluegun_1.system.exec('git pull origin public', { cwd: process.env.MODDABLE });
19
19
  await gluegun_1.system.exec('rm -rf build/{tmp,bin}', { cwd: process.env.MODDABLE });
20
- spinner.info('Rebuilding platform tools');
20
+ spinner.succeed();
21
+ spinner.start('Rebuilding platform tools');
21
22
  await gluegun_1.system.exec('make', {
22
23
  cwd: gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'makefiles', 'mac'),
23
24
  });
24
25
  spinner.succeed('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
25
26
  }
26
27
  exports.default = default_1;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvdXBkYXRlL21hYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUFtRDtBQUVwQyxLQUFLO0lBQ2xCLGVBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUV0QyxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDOUQsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUN6QyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUN4QixHQUFHLEVBQUUsb0JBQVUsQ0FBQyxPQUFPLENBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUM1QixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTjtLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxPQUFPLENBQ2IsMEhBQTBILENBQzNILENBQUE7QUFDSCxDQUFDO0FBdENELDRCQXNDQyJ9
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvdXBkYXRlL21hYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUFtRDtBQUVwQyxLQUFLO0lBQ2xCLGVBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUV0QyxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDL0QsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqQixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDMUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDeEIsR0FBRyxFQUFFLG9CQUFVLENBQUMsT0FBTyxDQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFDNUIsT0FBTyxFQUNQLFdBQVcsRUFDWCxLQUFLLENBQ047S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLENBQUMsT0FBTyxDQUNiLDBIQUEwSCxDQUMzSCxDQUFBO0FBQ0gsQ0FBQztBQXZDRCw0QkF1Q0MifQ==
@@ -0,0 +1,3 @@
1
+ import type { GluegunCommand } from 'gluegun';
2
+ declare const command: GluegunCommand;
3
+ export default command;
@@ -3,3 +3,4 @@ export declare const INSTALL_DIR: string;
3
3
  export declare const INSTALL_PATH: string;
4
4
  export declare const PROFILE: string;
5
5
  export declare const PROFILE_PATH: string;
6
+ export declare const EXPORTS_FILE_PATH: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xs-dev",
3
- "version": "0.0.1",
3
+ "version": "0.1.0",
4
4
  "description": "CLI for automating the setup and usage of Moddable XS tools",
5
5
  "types": "build/types/types.d.ts",
6
6
  "bin": {
@@ -15,6 +15,10 @@
15
15
  "bin"
16
16
  ],
17
17
  "license": "MIT",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/HipsterBrown/xs-dev.git"
21
+ },
18
22
  "dependencies": {
19
23
  "axios": "^0.24.0",
20
24
  "gluegun": "latest",
@@ -23,6 +27,7 @@
23
27
  "unzip-stream": "^0.3.1"
24
28
  },
25
29
  "devDependencies": {
30
+ "@changesets/cli": "^2.19.0",
26
31
  "@types/jest": "^27.4.0",
27
32
  "@types/node": "^16.11.0",
28
33
  "@types/serve-handler": "^6.1.1",
@@ -65,5 +70,5 @@
65
70
  "snapupdate": "jest --updateSnapshot",
66
71
  "coverage": "jest --coverage"
67
72
  },
68
- "readme": "# CLI for automating the setup and usage of [Moddable XS tools](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md)\n\nThe Moddable SDK and associated dev board tooling is incredibly empowering for embedded JS hardware development, however the set up process can be tedious to follow when getting started. This project aims to streamline the install and environment configuration requirements across platforms in just a few commands.\n\n**This project is a work in progress and should be considered pre-1.0.**\n\n**Feature support:**\n\n- [X] [Moddable SDK install & setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md)\n- [X] [ESP32 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp32.md)\n- [X] [ESP8266 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp8266.md)\n- [ ] [Gecko SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/gecko/GeckoBuild.md)\n- [ ] [QCA4020 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/qca4020/README.md)\n- [X] Update Moddable SDK\n- [X] Project management, including dependencies\n- [X] WASM simulator\n- [ ] Raspberry Pi Pico\n\n**Platform support:**\n\n- [X] Mac\n- [ ] Windows\n- [ ] Linux\n\n## Requirements\n\n[Node.js >= v12](https://nodejs.org/en/)\n\n## Install\n\n```\nnpm install -g xs-dev\n```\n\n## Features\n\n### Moddable SDK install / setup / update\n\nThis process mostly automates the instructions provided by Moddable's \"Getting Started\" documentation with a few exceptions:\n\n- it will not install XCode, just ensures the command line tools are available\n- the `moddable` git repo is cloned into `~/.local/share` instead of a new/existing `~/Projects` directory\n- a symlink for `xsbug.app` is created in `/Applications` for easy access through Launchpad (on Mac)\n\nRun script for initial setup:\n\n```\nxs-dev setup\n```\n\nRun script for updating SDK:\n\n```\nxs-dev update\n```\n\n### ESP32 SDK install / setup\n\nThis process automates the instructions for downloading and building the esp-idf SDK tooling. This tooling will be placed in the `~/.local/share/esp32` directory, which will be created if it doesn't exist.\n\nRun script for platform setup:\n\n```\nxs-dev setup --device=esp32\n```\n\nRun script to confirm the setup:\n\n```\nxs-dev run --example helloworld --device=esp32\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n### ESP8266 SDK install / setup\n\nThis process automates the instructions for downloading all the dependencies for the ESP8266 RTOS SDK. These dependencies will be placed in the `~/.local/share/esp` directory, which will be created if it doesn't exist.\n\nRun script for platform setup:\n\n```\nxs-dev setup --device=esp8266\n```\n\nRun script to confirm the setup:\n\n```\nxs-dev run --example helloworld --device=esp8266\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n### Wasm Simulator install / setup\n\nThis process automates the instructions for downloading all the dependencies for the [wasm simulator](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/wasm.md) and building the Moddable tooling. These dependencies will be placed in `~/.local/share/wasm`, which will be created if it doesn't exist.\n\nRun script for platform setup:\n\n```\nxs-dev setup --device=wasm\n```\n\n_If there are issues building the Moddable wasm tools, please try running `eval $SHELL` or starting a new shell insance before running the setup script again._\n\n\nRun script to confirm the setup:\n\n```\nxs-dev run --example helloworld --device=wasm\n```\n\n### Run Moddable examples\n\nWhile it is still possible to run the Moddable example projects in the documented workflow:\n\n```\ncd $MODDABLE/examples/<example directory>\nmcconfig -d -m -p <platform here>\n```\n\nThis tool aims to simplify that process.\n\nList available examples:\n```\nxs-dev run --list-examples\n```\n\nRun an example (coming soon):\n```\nxs-dev run --example helloworld\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n## Project management\n\n### Start a project\n\n\n```\nxs-dev init my-project\n```\n\nCreates a `main.js` and base configured `manifest.json` for running in the simulator.\n\nFlags:\n\n- `typescript`: includes typings and creates `main.ts` (experimental)\n- `io`: includes [TC53 IO manifest](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/io/io.md)\n\n### Build and run a project\n\nIn the project directory:\n\n```\nxs-dev run\n```\n\nWhen not in the project directory:\n\n```\nxs-dev run path/to/project\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n### Add a Moddable module\n\n```\nxs-dev include network/wifi\n```\n\nOr select from available modules:\n\n```\nxs-dev include\n```\n\nUpdates the `manifest.json` with the path to the dependency.\n\n### Add a remote dependency (Coming soon)\n\n```\nxs-dev get dtex/j5e\n```\n\nAssumes the dependency is a GitHub repo, clones it to `~/.local/share`, creates an environment variable with the name of the repo, and updates the `manifest.json` with the path to that dependency.\n\nTo include a specific module for the installed dependency:\n\n```\nxs-dev include j5e/lib/led\n```\n\n### Remove a dependency\n\n```\nxs-dev remove network/wifi\n```\n\nUpdates the `manifest.json` to remove the dependency.\n"
73
+ "readme": "# CLI for automating the setup and usage of [Moddable XS tools](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md)\n\nThe Moddable SDK and associated dev board tooling is incredibly empowering for embedded JS hardware development, however the set up process can be tedious to follow when getting started. This project aims to streamline the install and environment configuration requirements across platforms in just a few commands.\n\n**This project is a work in progress and should be considered pre-1.0.**\n\n**Feature support:**\n\n- [X] [Moddable SDK install & setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md)\n- [X] [ESP32 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp32.md)\n- [X] [ESP8266 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp8266.md)\n- [ ] [Gecko SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/gecko/GeckoBuild.md)\n- [ ] [QCA4020 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/qca4020/README.md)\n- [X] Update Moddable SDK\n- [X] Project management, including dependencies\n- [X] WASM simulator\n- [ ] Raspberry Pi Pico\n\n**Platform support:**\n\n- [X] Mac\n- [ ] Windows\n- [ ] Linux\n\n## Requirements\n\n[Node.js >= v12](https://nodejs.org/en/)\n\n## Install\n\n```\nnpm install -g xs-dev\n```\n\n## Features\n\n### Moddable SDK install / setup / update\n\nThis process mostly automates the instructions provided by Moddable's \"Getting Started\" documentation with a few exceptions:\n\n- it will not install XCode, just ensures the command line tools are available\n- the `moddable` git repo is cloned into `~/.local/share` instead of a new/existing `~/Projects` directory\n- a symlink for `xsbug.app` is created in `/Applications` for easy access through Launchpad (on Mac)\n\nRun script for initial setup:\n\n```\nxs-dev setup\n```\n\nRun script for updating SDK:\n\n```\nxs-dev update\n```\n\n### ESP32 SDK install / setup\n\nThis process automates the instructions for downloading and building the esp-idf SDK tooling. This tooling will be placed in the `~/.local/share/esp32` directory, which will be created if it doesn't exist.\n\nRun script for platform setup:\n\n```\nxs-dev setup --device=esp32\n```\n\nRun script to confirm the setup:\n\n```\nxs-dev run --example helloworld --device=esp32\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n### ESP8266 SDK install / setup\n\nThis process automates the instructions for downloading all the dependencies for the ESP8266 RTOS SDK. These dependencies will be placed in the `~/.local/share/esp` directory, which will be created if it doesn't exist.\n\nRun script for platform setup:\n\n```\nxs-dev setup --device=esp8266\n```\n\nRun script to confirm the setup:\n\n```\nxs-dev run --example helloworld --device=esp8266\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n### Wasm Simulator install / setup\n\nThis process automates the instructions for downloading all the dependencies for the [wasm simulator](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/wasm.md) and building the Moddable tooling. These dependencies will be placed in `~/.local/share/wasm`, which will be created if it doesn't exist.\n\nRun script for platform setup:\n\n```\nxs-dev setup --device=wasm\n```\n\n_If there are issues building the Moddable wasm tools, please try running `eval $SHELL` or starting a new shell insance before running the setup script again._\n\n\nRun script to confirm the setup:\n\n```\nxs-dev run --example helloworld --device=wasm\n```\n\n### Run Moddable examples\n\nWhile it is still possible to run the Moddable example projects in the documented workflow:\n\n```\ncd $MODDABLE/examples/<example directory>\nmcconfig -d -m -p <platform here>\n```\n\nThis tool aims to simplify that process.\n\nList available examples:\n```\nxs-dev run --list-examples\n```\n\nRun an example (coming soon):\n```\nxs-dev run --example helloworld\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n## Project management\n\n### Start a project\n\n\n```\nxs-dev init my-project\n```\n\nCreates a `main.js` and base configured `manifest.json` for running in the simulator.\n\nFlags:\n\n- `typescript`: includes typings and creates `main.ts` (experimental)\n- `io`: includes [TC53 IO manifest](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/io/io.md)\n\n### Build and run a project\n\nIn the project directory:\n\n```\nxs-dev run\n```\n\nWhen not in the project directory:\n\n```\nxs-dev run path/to/project\n```\n\nFlags:\n\n- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)\n- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)\n\n### Add a Moddable module\n\n```\nxs-dev include network/wifi\n```\n\nOr select from available modules:\n\n```\nxs-dev include\n```\n\nUpdates the `manifest.json` with the path to the dependency.\n\n### Add a remote dependency (Coming soon)\n\n```\nxs-dev get dtex/j5e\n```\n\nAssumes the dependency is a GitHub repo, clones it to `~/.local/share`, creates an environment variable with the name of the repo, and updates the `manifest.json` with the path to that dependency.\n\nTo include a specific module for the installed dependency:\n\n```\nxs-dev include j5e/lib/led\n```\n\n### Remove a dependency\n\n```\nxs-dev remove network/wifi\n```\n\nUpdates the `manifest.json` to remove the dependency.\n\n## Development\n\nClone the project and install dependencies. We're using [pnpm](https://pnpm.io/) and [volta](https://volta.sh/) to manage packages and Node.\n\n```\ngit clone https://github.com/HipsterBrown/xs-dev.git\ncd xs-dev\npnpm install\n```\n\nLink dev version of CLI:\n\n```\npnpm link .\n```\n"
69
74
  }