xs-dev 0.0.1 → 0.3.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
@@ -34,7 +34,7 @@ npm install -g xs-dev
34
34
 
35
35
  ## Features
36
36
 
37
- ### Moddable SDK install / setup / update
37
+ ### Moddable SDK setup / update / teardown
38
38
 
39
39
  This process mostly automates the instructions provided by Moddable's "Getting Started" documentation with a few exceptions:
40
40
 
@@ -54,6 +54,12 @@ Run script for updating SDK:
54
54
  xs-dev update
55
55
  ```
56
56
 
57
+ Remove all setup and environment changes with teardown command:
58
+
59
+ ```
60
+ xs-dev teardown
61
+ ```
62
+
57
63
  ### ESP32 SDK install / setup
58
64
 
59
65
  This 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.
@@ -211,3 +217,32 @@ xs-dev remove network/wifi
211
217
  ```
212
218
 
213
219
  Updates the `manifest.json` to remove the dependency.
220
+
221
+ ## Development
222
+
223
+ Clone the project and install dependencies. We're using [pnpm](https://pnpm.io/) and [volta](https://volta.sh/) to manage packages and Node.
224
+
225
+ ```
226
+ git clone https://github.com/HipsterBrown/xs-dev.git
227
+ cd xs-dev
228
+ pnpm install
229
+ ```
230
+
231
+ Link dev version of CLI using `pnpm`, which will override any other globally installed version:
232
+
233
+ ```
234
+ pnpm link --global
235
+ pnpm link --global xs-dev
236
+ ```
237
+
238
+ Or create an alias to clearly denote the local version of the CLI:
239
+
240
+ ```
241
+ alias local-xs-dev=$PWD/bin/xs-dev
242
+ ```
243
+
244
+ To maintain the alias between shell sessions, for example I use zsh:
245
+
246
+ ```
247
+ echo "alias local-xs-dev=$PWD/bin/xs-dev" >> ~/.zshrc
248
+ ```
@@ -22,9 +22,52 @@ const command = {
22
22
  run: async ({ parameters, print, system, filesystem, prompt }) => {
23
23
  var _a, _b, _c;
24
24
  const currentPlatform = (0, os_1.type)().toLowerCase();
25
- const { device = currentPlatform, port, example, listExamples = false, } = parameters.options;
26
- const targetPlatform = (_a = DEVICE_ALIAS[device]) !== null && _a !== void 0 ? _a : device;
25
+ const { device = currentPlatform, port, example, listExamples = false, listDevices = false, } = parameters.options;
26
+ let targetPlatform = (_a = DEVICE_ALIAS[device]) !== null && _a !== void 0 ? _a : device;
27
27
  let projectPath = filesystem.resolve((_b = parameters.first) !== null && _b !== void 0 ? _b : '.');
28
+ if (listDevices) {
29
+ const choices = [
30
+ 'esp',
31
+ 'esp/moddable_zero',
32
+ 'esp/moddable_one',
33
+ 'esp/moddable_three',
34
+ 'esp/nodemcu',
35
+ 'esp32',
36
+ 'esp32/moddable_two',
37
+ 'esp32/nodemcu',
38
+ 'esp32/m5stack',
39
+ 'esp32/m5stack_core2',
40
+ 'esp32/m5stick_fire',
41
+ 'esp32/m5atom_echo',
42
+ 'esp32/m5atom_lite',
43
+ 'esp32/m5atom_matrix',
44
+ 'esp32/m5paper',
45
+ 'esp32/m5core_ink',
46
+ 'esp32/heltec_wifi_kit_32',
47
+ 'esp32/esp32_thing',
48
+ 'esp32/esp32_thing_plus',
49
+ 'esp32/wrover_kit',
50
+ 'esp32/kaluga',
51
+ 'esp32/saola_wroom',
52
+ 'esp32/saola_wrover',
53
+ 'wasm',
54
+ ];
55
+ const { device: selectedDevice } = await prompt.ask([
56
+ {
57
+ type: 'autocomplete',
58
+ name: 'device',
59
+ message: 'Here are the available target devices:',
60
+ choices,
61
+ },
62
+ ]);
63
+ if (selectedDevice !== '' && selectedDevice !== undefined) {
64
+ targetPlatform = selectedDevice;
65
+ }
66
+ else {
67
+ print.warning('Please select a target device to run');
68
+ process.exit(0);
69
+ }
70
+ }
28
71
  if (listExamples) {
29
72
  const exampleProjectPath = filesystem.resolve(String(process.env.MODDABLE), 'examples');
30
73
  const examples = (_c = filesystem.inspectTree(exampleProjectPath)) === null || _c === void 0 ? void 0 : _c.children;
@@ -39,8 +82,14 @@ const command = {
39
82
  choices,
40
83
  },
41
84
  ]);
42
- print.info(`Run the example: xs-dev run --example ${selectedExample}`);
43
- process.exit(0);
85
+ if (selectedExample !== '' && selectedExample !== undefined) {
86
+ print.info(`Running the example: xs-dev run --example ${selectedExample}`);
87
+ projectPath = filesystem.resolve(exampleProjectPath, selectedExample);
88
+ }
89
+ else {
90
+ print.warning('Please select an example to run.');
91
+ process.exit(0);
92
+ }
44
93
  }
45
94
  if (example !== undefined) {
46
95
  const exampleProjectPath = filesystem.resolve(String(process.env.MODDABLE), 'examples', example);
@@ -73,4 +122,4 @@ const command = {
73
122
  },
74
123
  };
75
124
  exports.default = command;
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDJCQUF5QztBQUN6QyxrRUFBbUM7QUFDbkMsK0JBQW1DO0FBRW5DLHVEQUFrRTtBQVNsRSxNQUFNLFlBQVksR0FBdUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNyRSxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxLQUFLO0lBQ2IsVUFBVSxFQUFFLEtBQUs7SUFDakIsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsS0FBSztJQUNWLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07Q0FDYixDQUFDLENBQUE7QUFFRixNQUFNLE9BQU8sR0FBaUM7SUFDNUMsSUFBSSxFQUFFLEtBQUs7SUFDWCxXQUFXLEVBQUUsd0RBQXdEO0lBQ3JFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTs7UUFDL0QsTUFBTSxlQUFlLEdBQVcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQVksQ0FBQTtRQUN0RSxNQUFNLEVBQ0osTUFBTSxHQUFHLGVBQWUsRUFDeEIsSUFBSSxFQUNKLE9BQU8sRUFDUCxZQUFZLEdBQUcsS0FBSyxHQUNyQixHQUFlLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDbEMsTUFBTSxjQUFjLEdBQVcsTUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLG1DQUFJLE1BQU0sQ0FBQTtRQUM3RCxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQUEsVUFBVSxDQUFDLEtBQUssbUNBQUksR0FBRyxDQUFDLENBQUE7UUFFN0QsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUMzQyxNQUFNLENBQUMsT0FB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
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDJCQUF5QztBQUN6QyxrRUFBbUM7QUFDbkMsK0JBQW1DO0FBRW5DLHVEQUFrRTtBQVVsRSxNQUFNLFlBQVksR0FBdUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNyRSxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxLQUFLO0lBQ2IsVUFBVSxFQUFFLEtBQUs7SUFDakIsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsS0FBSztJQUNWLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07Q0FDYixDQUFDLENBQUE7QUFFRixNQUFNLE9BQU8sR0FBaUM7SUFDNUMsSUFBSSxFQUFFLEtBQUs7SUFDWCxXQUFXLEVBQUUsd0RBQXdEO0lBQ3JFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTs7UUFDL0QsTUFBTSxlQUFlLEdBQVcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQVksQ0FBQTtRQUN0RSxNQUFNLEVBQ0osTUFBTSxHQUFHLGVBQWUsRUFDeEIsSUFBSSxFQUNKLE9BQU8sRUFDUCxZQUFZLEdBQUcsS0FBSyxFQUNwQixXQUFXLEdBQUcsS0FBSyxHQUNwQixHQUFlLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDbEMsSUFBSSxjQUFjLEdBQVcsTUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLG1DQUFJLE1BQU0sQ0FBQTtRQUMzRCxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQUEsVUFBVSxDQUFDLEtBQUssbUNBQUksR0FBRyxDQUFDLENBQUE7UUFFN0QsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLO2dCQUNM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
@@ -4,11 +4,30 @@ const os_1 = require("os");
4
4
  const command = {
5
5
  name: 'setup',
6
6
  description: 'Download and build Moddable tooling for various platform targets',
7
- run: async ({ parameters, setup }) => {
7
+ run: async ({ parameters, setup, prompt, print }) => {
8
8
  const currentPlatform = (0, os_1.type)().toLowerCase();
9
- const { device = currentPlatform } = parameters.options;
10
- await setup[device]();
9
+ const { device, listDevices = false } = parameters.options;
10
+ let target = device !== null && device !== void 0 ? device : currentPlatform;
11
+ if (device === undefined && listDevices) {
12
+ const choices = ['esp8266', 'esp32', 'wasm', currentPlatform];
13
+ const { device: selectedDevice } = await prompt.ask([
14
+ {
15
+ type: 'autocomplete',
16
+ name: 'device',
17
+ message: 'Here are the available target devices:',
18
+ choices,
19
+ },
20
+ ]);
21
+ if (selectedDevice !== '' && selectedDevice !== undefined) {
22
+ target = selectedDevice;
23
+ }
24
+ else {
25
+ print.warning('Please select a target device to run');
26
+ process.exit(0);
27
+ }
28
+ }
29
+ await setup[target]();
11
30
  },
12
31
  };
13
32
  exports.default = command;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwyQkFBeUM7QUFPekMsTUFBTSxPQUFPLEdBQWlDO0lBQzVDLElBQUksRUFBRSxPQUFPO0lBQ2IsV0FBVyxFQUNULGtFQUFrRTtJQUNwRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDbkMsTUFBTSxlQUFlLEdBQVcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQVksQ0FBQTtRQUN0RSxNQUFNLEVBQUUsTUFBTSxHQUFHLGVBQWUsRUFBRSxHQUFpQixVQUFVLENBQUMsT0FBTyxDQUFBO1FBQ3JFLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUE7SUFDdkIsQ0FBQztDQUNGLENBQUE7QUFFRCxrQkFBZSxPQUFPLENBQUEifQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwyQkFBeUM7QUFRekMsTUFBTSxPQUFPLEdBQWlDO0lBQzVDLElBQUksRUFBRSxPQUFPO0lBQ2IsV0FBVyxFQUNULGtFQUFrRTtJQUNwRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUNsRCxNQUFNLGVBQWUsR0FBVyxJQUFBLFNBQVksR0FBRSxDQUFDLFdBQVcsRUFBWSxDQUFBO1FBQ3RFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxHQUFHLEtBQUssRUFBRSxHQUFpQixVQUFVLENBQUMsT0FBTyxDQUFBO1FBQ3hFLElBQUksTUFBTSxHQUFXLE1BQU0sYUFBTixNQUFNLGNBQU4sTUFBTSxHQUFJLGVBQWUsQ0FBQTtRQUU5QyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksV0FBVyxFQUFFO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUE7WUFDN0QsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ2xEO29CQUNFLElBQUksRUFBRSxjQUFjO29CQUNwQixJQUFJLEVBQUUsUUFBUTtvQkFDZCxPQUFPLEVBQUUsd0NBQXdDO29CQUNqRCxPQUFPO2lCQUNSO2FBQ0YsQ0FBQyxDQUFBO1lBRUYsSUFBSSxjQUFjLEtBQUssRUFBRSxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pELE1BQU0sR0FBRyxjQUF3QixDQUFBO2FBQ2xDO2lCQUFNO2dCQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtnQkFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUNoQjtTQUNGO1FBRUQsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtJQUN2QixDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
@@ -0,0 +1,23 @@
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 PROFILE_PATH = (0, constants_1.getProfilePath)();
9
+ const spinner = print.spin();
10
+ spinner.start('Tearing down Moddable tools and platform dependencies');
11
+ filesystem.remove(constants_1.EXPORTS_FILE_PATH);
12
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'moddable'));
13
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'wasm'));
14
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'esp32'));
15
+ filesystem.remove(filesystem.resolve(constants_1.INSTALL_DIR, 'esp'));
16
+ await patching.patch(PROFILE_PATH, {
17
+ delete: `source ${constants_1.EXPORTS_FILE_PATH}`,
18
+ });
19
+ spinner.succeed(`Clean up complete!`);
20
+ },
21
+ };
22
+ exports.default = command;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhcmRvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvdGVhcmRvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwwREFJbUM7QUFFbkMsTUFBTSxPQUFPLEdBQW1CO0lBQzlCLElBQUksRUFBRSxVQUFVO0lBQ2hCLFdBQVcsRUFDVCwwRUFBMEU7SUFDNUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUM3QyxNQUFNLFlBQVksR0FBRyxJQUFBLDBCQUFjLEdBQUUsQ0FBQTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO1FBRXRFLFVBQVUsQ0FBQyxNQUFNLENBQUMsNkJBQWlCLENBQUMsQ0FBQTtRQUNwQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzlELFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDMUQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBRXpELE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7WUFDakMsTUFBTSxFQUFFLFVBQVUsNkJBQWlCLEVBQUU7U0FDdEMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7Q0FDRixDQUFBO0FBRUQsa0JBQWUsT0FBTyxDQUFBIn0=
@@ -1,19 +1,29 @@
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.getProfilePath = exports.MODDABLE_REPO = exports.EXPORTS_FILE_PATH = 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');
8
8
  exports.INSTALL_PATH = (_a = process.env.MODDABLE) !== null && _a !== void 0 ? _a : gluegun_1.filesystem.resolve(exports.INSTALL_DIR, 'moddable');
9
- exports.PROFILE = (function () {
9
+ exports.EXPORTS_FILE_PATH = gluegun_1.filesystem.resolve(exports.HOME_DIR, '.local', 'share', 'xs-dev-export.sh');
10
+ exports.MODDABLE_REPO = 'https://github.com/Moddable-OpenSource/moddable';
11
+ function getProfilePath() {
10
12
  var _a;
11
13
  const shell = (_a = process.env.SHELL) !== null && _a !== void 0 ? _a : '';
12
- if (shell.includes('zsh'))
13
- return '.zshrc';
14
- if (shell.includes('bash'))
15
- return '.bashrc';
16
- return '.profile';
17
- })();
18
- exports.PROFILE_PATH = gluegun_1.filesystem.resolve(exports.HOME_DIR, exports.PROFILE);
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxQ0FBb0M7QUFFdkIsUUFBQSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUMvQixRQUFBLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM3RCxRQUFBLFlBQVksR0FDdkIsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUN4RCxRQUFBLE9BQU8sR0FBRyxDQUFDOztJQUN0QixNQUFNLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUE7SUFDckMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQzFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUM1QyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ1MsUUFBQSxZQUFZLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsRUFBRSxlQUFPLENBQUMsQ0FBQSJ9
14
+ let profile = '.profile';
15
+ if (shell.includes('zsh')) {
16
+ profile = '.zshrc';
17
+ }
18
+ if (shell.includes('bash')) {
19
+ profile = '.bashrc';
20
+ }
21
+ let profilePath = gluegun_1.filesystem.resolve(exports.HOME_DIR, profile);
22
+ if (gluegun_1.filesystem.exists(profilePath) === 'file')
23
+ return profilePath;
24
+ profilePath = gluegun_1.filesystem.resolve(exports.HOME_DIR, '.profile');
25
+ gluegun_1.filesystem.file(profilePath);
26
+ return profilePath;
27
+ }
28
+ exports.getProfilePath = getProfilePath;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxQ0FBb0M7QUFFdkIsUUFBQSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUMvQixRQUFBLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM3RCxRQUFBLFlBQVksR0FDdkIsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUN4RCxRQUFBLGlCQUFpQixHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNqRCxnQkFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1Asa0JBQWtCLENBQ25CLENBQUE7QUFDWSxRQUFBLGFBQWEsR0FBRyxpREFBaUQsQ0FBQTtBQUM5RSxTQUFnQixjQUFjOztJQUM1QixNQUFNLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUE7SUFDckMsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFBO0lBRXhCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN6QixPQUFPLEdBQUcsUUFBUSxDQUFBO0tBQ25CO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzFCLE9BQU8sR0FBRyxTQUFTLENBQUE7S0FDcEI7SUFFRCxJQUFJLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZELElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTTtRQUFFLE9BQU8sV0FBVyxDQUFBO0lBRWpFLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3RELG9CQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzVCLE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFqQkQsd0NBaUJDIn0=
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installDeps = void 0;
4
+ const exec_1 = require("../../system/exec");
5
+ // apt-get install git wget flex bison gperf python-is-python3 python3-pip python3-serial python-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util
6
+ async function installDeps(spinner) {
7
+ await (0, exec_1.execWithSudo)('apt-get install --yes git wget flex bison gperf python-is-python3 python3-pip python3-serial python-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util', { stdout: process.stdout });
8
+ spinner.succeed();
9
+ }
10
+ exports.installDeps = installDeps;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3AzMi9saW51eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw0Q0FBZ0Q7QUFFaEQsbUtBQW1LO0FBQzVKLEtBQUssVUFBVSxXQUFXLENBQy9CLE9BQXlDO0lBRXpDLE1BQU0sSUFBQSxtQkFBWSxFQUNoQix3S0FBd0ssRUFDeEssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUMzQixDQUFBO0lBQ0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ25CLENBQUM7QUFSRCxrQ0FRQyJ9
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installDeps = void 0;
4
+ const gluegun_1 = require("gluegun");
5
+ // brew install python3, cmake, ninja, dfu-util
6
+ async function installDeps(spinner) {
7
+ if (gluegun_1.system.which('python') === null ||
8
+ // get python verion, check if v3
9
+ gluegun_1.semver.satisfies((await gluegun_1.system.exec('python --version', { trim: true }))
10
+ .toString()
11
+ .split(' ')
12
+ .pop(), '>= 3.x.x')) {
13
+ await gluegun_1.system.exec('brew install python');
14
+ }
15
+ if (gluegun_1.system.which('cmake') === null) {
16
+ await gluegun_1.system.exec('brew install cmake');
17
+ }
18
+ if (gluegun_1.system.which('ninja') === null) {
19
+ await gluegun_1.system.exec('brew install ninja');
20
+ }
21
+ if (gluegun_1.system.which('dfu-util') === null) {
22
+ await gluegun_1.system.exec('brew install dfu-util');
23
+ }
24
+ // 4. install pip, if needed
25
+ if (gluegun_1.system.which('pip3') === null) {
26
+ spinner.start('Installing pip3');
27
+ await gluegun_1.system.exec('python3 -m ensurepip --user');
28
+ spinner.succeed();
29
+ }
30
+ // 5. pip install pyserial, if needed
31
+ spinner.start('Installing pyserial through pip3');
32
+ await gluegun_1.system.exec('python3 -m pip install pyserial');
33
+ spinner.succeed();
34
+ }
35
+ exports.installDeps = installDeps;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvZXNwMzIvbWFjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUF3QztBQUd4QywrQ0FBK0M7QUFDeEMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsT0FBeUM7SUFFekMsSUFDRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJO1FBQy9CLGlDQUFpQztRQUNqQyxnQkFBTSxDQUFDLFNBQVMsQ0FDZCxDQUFDLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNwRCxRQUFRLEVBQUU7YUFDVixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxFQUFFLEVBQ1IsVUFBVSxDQUNYLEVBQ0Q7UUFDQSxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7S0FDekM7SUFFRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7S0FDeEM7SUFFRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7S0FDeEM7SUFFRCxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNyQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUE7S0FDM0M7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUNoRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7S0FDbEI7SUFFRCxxQ0FBcUM7SUFDckMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUNwRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDbkIsQ0FBQztBQXhDRCxrQ0F3Q0MifQ==
@@ -4,71 +4,68 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const gluegun_1 = require("gluegun");
7
+ const os_1 = require("os");
7
8
  const constants_1 = require("./constants");
9
+ const moddable_1 = require("./moddable");
8
10
  const upsert_1 = __importDefault(require("../patching/upsert"));
11
+ const mac_1 = require("./esp32/mac");
12
+ const linux_1 = require("./esp32/linux");
9
13
  async function default_1() {
14
+ const OS = (0, os_1.type)().toLowerCase();
10
15
  const ESP_IDF_REPO = 'https://github.com/espressif/esp-idf.git';
11
16
  const ESP_BRANCH = 'v4.3.1';
12
17
  const ESP32_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'esp32');
13
18
  const IDF_PATH = gluegun_1.filesystem.resolve(ESP32_DIR, 'esp-idf');
14
- gluegun_1.print.info('Setting up esp32 tools');
19
+ const spinner = gluegun_1.print.spin();
20
+ spinner.start('Setting up esp32 tools');
15
21
  // 0. ensure Moddable exists
16
- if (process.env.MODDABLE === undefined) {
17
- gluegun_1.print.warning('Moddable tooling required. Run `xs-dev setup` before trying again.');
22
+ if (!(0, moddable_1.moddableExists)()) {
23
+ spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
18
24
  process.exit(1);
19
25
  }
20
26
  // 1. ensure ~/.local/share/esp32 directory
21
- gluegun_1.print.info('Ensuring esp32 install directory');
27
+ spinner.info('Ensuring esp32 install directory');
22
28
  gluegun_1.filesystem.dir(ESP32_DIR);
29
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH);
23
30
  // 2. clone esp-idf into ~/.local/share/esp32/esp-idf
24
31
  if (gluegun_1.filesystem.exists(IDF_PATH) === false) {
25
- gluegun_1.print.info('Cloning esp-idf repo');
32
+ spinner.start('Cloning esp-idf repo');
26
33
  await gluegun_1.system.spawn(`git clone -b ${ESP_BRANCH} --recursive ${ESP_IDF_REPO} ${IDF_PATH}`);
34
+ spinner.succeed();
27
35
  }
28
- // 3. brew install python3, cmake, ninja, dfu-util
29
- gluegun_1.print.info('Installing build dependencies: python, cmake, ninja, dfu-util');
30
- if (gluegun_1.system.which('python') === null ||
31
- // get python verion, check if v3
32
- gluegun_1.semver.satisfies((await gluegun_1.system.exec('python --version', { trim: true }))
33
- .toString()
34
- .split(' ')
35
- .pop(), '>= 3.x.x')) {
36
- await gluegun_1.system.spawn('brew install python');
36
+ // 3. Install build and run dependencies
37
+ spinner.start('Installing build dependencies');
38
+ if (OS === 'darwin') {
39
+ await (0, mac_1.installDeps)(spinner);
37
40
  }
38
- if (gluegun_1.system.which('cmake') === null) {
39
- await gluegun_1.system.spawn('brew install cmake');
41
+ if (OS === 'linux') {
42
+ await (0, linux_1.installDeps)(spinner);
40
43
  }
41
- if (gluegun_1.system.which('ninja') === null) {
42
- await gluegun_1.system.spawn('brew install ninja');
43
- }
44
- if (gluegun_1.system.which('dfu-util') === null) {
45
- await gluegun_1.system.spawn('brew install dfu-util');
46
- }
47
- // 4. install pip, if needed
48
- if (gluegun_1.system.which('pip3') === null) {
49
- gluegun_1.print.info('Installing pip3');
50
- await gluegun_1.system.spawn('python3 -m ensurepip --user');
51
- }
52
- // 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');
55
- // 6. append IDF_PATH env export to shell profile
44
+ // 4. append IDF_PATH env export to shell profile
56
45
  if (process.env.IDF_PATH === undefined) {
57
- gluegun_1.print.info('Configuring $IDF_PATH');
46
+ spinner.info('Configuring $IDF_PATH');
58
47
  process.env.IDF_PATH = IDF_PATH;
59
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export IDF_PATH=${IDF_PATH}`);
48
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export IDF_PATH=${IDF_PATH}`);
60
49
  }
61
- // 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 });
64
- // 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(`
50
+ // 5. cd to IDF_PATH, run install.sh
51
+ spinner.start('Installing esp-idf tooling');
52
+ await gluegun_1.system.exec('./install.sh', {
53
+ cwd: IDF_PATH,
54
+ shell: process.env.SHELL,
55
+ stdout: process.stdout,
56
+ });
57
+ spinner.succeed();
58
+ // 6. append 'source $IDF_PATH/export.sh' to shell profile
59
+ spinner.info('Sourcing esp-idf environment');
60
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `source $IDF_PATH/export.sh`);
61
+ await gluegun_1.system.exec('source $IDF_PATH/export.sh', {
62
+ shell: process.env.SHELL,
63
+ });
64
+ spinner.succeed(`
68
65
  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
66
+ Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device=esp32
70
67
  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
68
  `);
72
69
  }
73
70
  exports.default = default_1;
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwMzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3AzMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUEyRDtBQUMzRCwyQ0FBdUQ7QUFDdkQsZ0VBQXVDO0FBRXhCLEtBQUs7SUFDbEIsTUFBTSxZQUFZLEdBQUcsMENBQTBDLENBQUE7SUFDL0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFBO0lBQzNCLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDMUQsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3pELGVBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUVwQyw0QkFBNEI7SUFDNUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDdEMsZUFBSyxDQUFDLE9BQU8sQ0FDWCxvRUFBb0UsQ0FDckUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCwyQ0FBMkM7SUFDM0MsZUFBSyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO0lBQzlDLG9CQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRXpCLHFEQUFxRDtJQUNyRCxJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUN6QyxlQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFDbEMsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FDaEIsZ0JBQWdCLFVBQVUsZ0JBQWdCLFlBQVksSUFBSSxRQUFRLEVBQUUsQ0FDckUsQ0FBQTtLQUNGO0lBRUQsa0RBQWtEO0lBQ2xELGVBQUssQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQTtJQUUzRSxJQUNFLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUk7UUFDL0IsaUNBQWlDO1FBQ2pDLGdCQUFNLENBQUMsU0FBUyxDQUNkLENBQUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3BELFFBQVEsRUFBRTthQUNWLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLEVBQUUsRUFDUixVQUFVLENBQ1gsRUFDRDtRQUNBLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtLQUMxQztJQUVELElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2xDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtLQUN6QztJQUVELElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2xDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtLQUN6QztJQUVELElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3JDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtLQUM1QztJQUVELDRCQUE0QjtJQUM1QixJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQyxlQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDN0IsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0tBQ2xEO0lBRUQscUNBQXFDO0lBQ3JDLGVBQUssQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUM5QyxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7SUFFckQsaURBQWlEO0lBQ2pELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDL0IsTUFBTSxJQUFBLGdCQUFNLEVBQUMsd0JBQVksRUFBRSxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUMxRDtJQUVELG9DQUFvQztJQUNwQyxlQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUE7SUFDeEMsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUVyRCwwREFBMEQ7SUFDMUQsZUFBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sSUFBQSxnQkFBTSxFQUFDLHdCQUFZLEVBQUUsNEJBQTRCLENBQUMsQ0FBQTtJQUV4RCxlQUFLLENBQUMsT0FBTyxDQUFDOzs7O0dBSWIsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQXRGRCw0QkFzRkMifQ==
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwMzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3AzMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUFtRDtBQUNuRCwyQkFBeUM7QUFDekMsMkNBQTREO0FBQzVELHlDQUEyQztBQUMzQyxnRUFBdUM7QUFDdkMscUNBQTJEO0FBQzNELHlDQUErRDtBQUVoRCxLQUFLO0lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUEsU0FBWSxHQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDdkMsTUFBTSxZQUFZLEdBQUcsMENBQTBDLENBQUE7SUFDL0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFBO0lBQzNCLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDMUQsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRXpELE1BQU0sT0FBTyxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7SUFFdkMsNEJBQTRCO0lBQzVCLElBQUksQ0FBQyxJQUFBLHlCQUFjLEdBQUUsRUFBRTtRQUNyQixPQUFPLENBQUMsSUFBSSxDQUNWLG9FQUFvRSxDQUNyRSxDQUFBO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELDJDQUEyQztJQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUE7SUFDaEQsb0JBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDekIsb0JBQVUsQ0FBQyxJQUFJLENBQUMsNkJBQWlCLENBQUMsQ0FBQTtJQUVsQyxxREFBcUQ7SUFDckQsSUFBSSxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQ2hCLGdCQUFnQixVQUFVLGdCQUFnQixZQUFZLElBQUksUUFBUSxFQUFFLENBQ3JFLENBQUE7UUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7S0FDbEI7SUFFRCx3Q0FBd0M7SUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBRTlDLElBQUksRUFBRSxLQUFLLFFBQVEsRUFBRTtRQUNuQixNQUFNLElBQUEsaUJBQWMsRUFBQyxPQUFPLENBQUMsQ0FBQTtLQUM5QjtJQUVELElBQUksRUFBRSxLQUFLLE9BQU8sRUFBRTtRQUNsQixNQUFNLElBQUEsbUJBQWdCLEVBQUMsT0FBTyxDQUFDLENBQUE7S0FDaEM7SUFFRCxpREFBaUQ7SUFDakQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUMvQixNQUFNLElBQUEsZ0JBQU0sRUFBQyw2QkFBaUIsRUFBRSxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUMvRDtJQUVELG9DQUFvQztJQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUE7SUFDM0MsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDaEMsR0FBRyxFQUFFLFFBQVE7UUFDYixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLO1FBQ3hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUE7SUFDRixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFakIsMERBQTBEO0lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUM1QyxNQUFNLElBQUEsZ0JBQU0sRUFBQyw2QkFBaUIsRUFBRSw0QkFBNEIsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7UUFDOUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSztLQUN6QixDQUFDLENBQUE7SUFFRixPQUFPLENBQUMsT0FBTyxDQUFDOzs7O0dBSWYsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQXZFRCw0QkF1RUMifQ==
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installDeps = void 0;
4
+ const exec_1 = require("../../system/exec");
5
+ async function installDeps(spinner) {
6
+ spinner.start('Installing python deps with apt-get');
7
+ await (0, exec_1.execWithSudo)('apt-get install --yes python-is-python3 python3-pip python3-serial', { stdout: process.stdout });
8
+ spinner.succeed();
9
+ }
10
+ exports.installDeps = installDeps;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3A4MjY2L2xpbnV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDRDQUFnRDtBQUV6QyxLQUFLLFVBQVUsV0FBVyxDQUMvQixPQUF5QztJQUV6QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7SUFDcEQsTUFBTSxJQUFBLG1CQUFZLEVBQ2hCLG9FQUFvRSxFQUNwRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQzNCLENBQUE7SUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDbkIsQ0FBQztBQVRELGtDQVNDIn0=
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installDeps = void 0;
4
+ const gluegun_1 = require("gluegun");
5
+ async function installDeps(spinner) {
6
+ if (gluegun_1.system.which('python') === null) {
7
+ spinner.start('Installing python from homebrew');
8
+ await gluegun_1.system.exec('brew install python');
9
+ spinner.succeed();
10
+ }
11
+ if (gluegun_1.system.which('pip') === null) {
12
+ spinner.start('Installing pip through ensurepip');
13
+ await gluegun_1.system.exec('python -m ensurepip');
14
+ spinner.succeed();
15
+ }
16
+ spinner.start('Installing pyserial through pip');
17
+ await gluegun_1.system.exec('python -m pip install pyserial');
18
+ spinner.succeed();
19
+ }
20
+ exports.installDeps = installDeps;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvZXNwODI2Ni9tYWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQWdDO0FBR3pCLEtBQUssVUFBVSxXQUFXLENBQy9CLE9BQXlDO0lBRXpDLElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUNoRCxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDeEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0tBQ2xCO0lBRUQsSUFBSSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUN4QyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7S0FDbEI7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7SUFDaEQsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO0lBQ25ELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNuQixDQUFDO0FBbEJELGtDQWtCQyJ9
@@ -5,14 +5,21 @@ 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");
13
+ const os_1 = require("os");
12
14
  const constants_1 = require("./constants");
15
+ const moddable_1 = require("./moddable");
13
16
  const upsert_1 = __importDefault(require("../patching/upsert"));
17
+ const mac_1 = require("./esp8266/mac");
18
+ const linux_1 = require("./esp8266/linux");
19
+ const finishedPromise = (0, util_1.promisify)(stream_1.finished);
14
20
  async function default_1() {
15
- const TOOLCHAIN = 'https://www.moddable.com/private/esp8266.toolchain.darwin.tgz';
21
+ const OS = (0, os_1.type)().toLowerCase();
22
+ const TOOLCHAIN = `https://www.moddable.com/private/esp8266.toolchain.${OS}.tgz`;
16
23
  const ARDUINO_CORE = 'https://github.com/esp8266/Arduino/releases/download/2.3.0/esp8266-2.3.0.zip';
17
24
  const ESP_RTOS_REPO = 'https://github.com/espressif/ESP8266_RTOS_SDK.git';
18
25
  const ESP_BRANCH = 'release/v3.2';
@@ -20,18 +27,19 @@ async function default_1() {
20
27
  const RTOS_PATH = gluegun_1.filesystem.resolve(ESP_DIR, 'ESP8266_RTOS_SDK');
21
28
  const TOOLCHAIN_PATH = gluegun_1.filesystem.resolve(ESP_DIR, 'toolchain');
22
29
  const ARDUINO_CORE_PATH = gluegun_1.filesystem.resolve(ESP_DIR, 'esp8266-2.3.0');
23
- gluegun_1.print.info('Setting up esp8266 tools');
30
+ const spinner = gluegun_1.print.spin();
31
+ spinner.start('Setting up esp8266 tools');
24
32
  // 0. ensure Moddable exists
25
- if (process.env.MODDABLE === undefined) {
26
- gluegun_1.print.warning('Moddable tooling required. Run `xs-dev setup` before trying again.');
33
+ if (!(0, moddable_1.moddableExists)()) {
34
+ spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
27
35
  process.exit(1);
28
36
  }
29
37
  // 1. ensure ~/.local/share/esp directory
30
- gluegun_1.print.info('Ensuring esp directory');
38
+ spinner.info('Ensuring esp directory');
31
39
  gluegun_1.filesystem.dir(ESP_DIR);
40
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH);
32
41
  // 2. download and untar xtensa toolchain
33
42
  if (gluegun_1.filesystem.exists(TOOLCHAIN_PATH) === false) {
34
- const spinner = gluegun_1.print.spin();
35
43
  spinner.start('Downloading xtensa toolchain');
36
44
  const writer = (0, tar_fs_1.extract)(ESP_DIR, { readable: true });
37
45
  const gunzip = (0, zlib_1.createGunzip)();
@@ -39,48 +47,44 @@ async function default_1() {
39
47
  responseType: 'stream',
40
48
  });
41
49
  response.data.pipe(gunzip).pipe(writer);
42
- await (0, promises_1.finished)(writer);
50
+ await finishedPromise(writer);
43
51
  spinner.succeed();
44
52
  }
45
53
  // 3. download and unzip esp8266 core for arduino
46
54
  if (gluegun_1.filesystem.exists(ARDUINO_CORE_PATH) === false) {
47
- const spinner = gluegun_1.print.spin();
48
55
  spinner.start('Downloading arduino core tooling');
49
56
  const writer = (0, unzip_stream_1.Extract)({ path: ESP_DIR });
50
57
  const response = await axios_1.default.get(ARDUINO_CORE, {
51
58
  responseType: 'stream',
52
59
  });
53
60
  response.data.pipe(writer);
54
- await (0, promises_1.finished)(writer);
61
+ await finishedPromise(writer);
55
62
  spinner.succeed();
56
63
  }
57
64
  // 4. clone esp8266 RTOS SDK
58
65
  if (gluegun_1.filesystem.exists(RTOS_PATH) === false) {
59
- gluegun_1.print.info('Cloning esp8266 RTOS SDK repo');
66
+ spinner.start('Cloning esp8266 RTOS SDK repo');
60
67
  await gluegun_1.system.spawn(`git clone -b ${ESP_BRANCH} ${ESP_RTOS_REPO} ${RTOS_PATH}`);
68
+ spinner.succeed();
61
69
  }
62
70
  // 5. ensure python, pip, and pyserial are installed
63
- 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');
71
+ if (OS === 'darwin') {
72
+ await (0, mac_1.installDeps)(spinner);
66
73
  }
67
- 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');
74
+ if (OS === 'linux') {
75
+ await (0, linux_1.installDeps)(spinner);
70
76
  }
71
- gluegun_1.print.info('Installing pyserial through pip');
72
- await gluegun_1.system.spawn('python -m pip install pyserial');
73
77
  // 7. create ESP_BARE env export in shell profile
74
78
  if (process.env.ESP_BASE === undefined) {
75
- gluegun_1.print.info('Configuring $ESP_BASE');
79
+ spinner.info('Configuring $ESP_BASE');
76
80
  process.env.ESP_BASE = ESP_DIR;
77
- await (0, upsert_1.default)(constants_1.PROFILE_PATH, `export ESP_BASE=${process.env.ESP_BASE}`);
81
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export ESP_BASE=${process.env.ESP_BASE}`);
78
82
  }
79
- gluegun_1.print.success(`
83
+ spinner.succeed(`
80
84
  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
85
+ Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device esp8266
82
86
  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
87
  `);
84
88
  }
85
89
  exports.default = default_1;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwODI2Ni5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDgyNjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQXlCO0FBQ3pCLDhDQUEwQztBQUMxQyxtQ0FBZ0M7QUFDaEMsK0JBQW1DO0FBQ25DLCtDQUFvRDtBQUNwRCwyQ0FBdUQ7QUFDdkQsZ0VBQXVDO0FBRXhCLEtBQUs7SUFDbEIsTUFBTSxTQUFTLEdBQ2IsK0RBQStELENBQUE7SUFDakUsTUFBTSxZQUFZLEdBQ2hCLDhFQUE4RSxDQUFBO0lBQ2hGLE1BQU0sYUFBYSxHQUFHLG1EQUFtRCxDQUFBO0lBQ3pFLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQTtJQUNqQyxNQUFNLE9BQU8sR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3RELE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sY0FBYyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUV0RSxlQUFLLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFFdEMsNEJBQTRCO0lBQzVCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxPQUFPLENBQ1gsb0VBQW9FLENBQ3JFLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQseUNBQXlDO0lBQ3pDLGVBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJ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
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwODI2Ni5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDgyNjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQXlCO0FBQ3pCLG1DQUFpQztBQUNqQywrQkFBZ0M7QUFDaEMsbUNBQWdDO0FBQ2hDLCtCQUFtQztBQUNuQywrQ0FBb0Q7QUFDcEQsMkJBQXlDO0FBQ3pDLDJDQUE0RDtBQUM1RCx5Q0FBMkM7QUFDM0MsZ0VBQXVDO0FBQ3ZDLHVDQUE2RDtBQUM3RCwyQ0FBaUU7QUFFakUsTUFBTSxlQUFlLEdBQUcsSUFBQSxnQkFBUyxFQUFDLGlCQUFRLENBQUMsQ0FBQTtBQUU1QixLQUFLO0lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUEsU0FBWSxHQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDdkMsTUFBTSxTQUFTLEdBQUcsc0RBQXNELEVBQUUsTUFBTSxDQUFBO0lBQ2hGLE1BQU0sWUFBWSxHQUNoQiw4RUFBOEUsQ0FBQTtJQUNoRixNQUFNLGFBQWEsR0FBRyxtREFBbUQsQ0FBQTtJQUN6RSxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUE7SUFDakMsTUFBTSxPQUFPLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN0RCxNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtJQUNqRSxNQUFNLGNBQWMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDL0QsTUFBTSxpQkFBaUIsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUE7SUFFdEUsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENB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
@@ -1,8 +1,64 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const gluegun_1 = require("gluegun");
7
+ const constants_1 = require("./constants");
8
+ const upsert_1 = __importDefault(require("../patching/upsert"));
9
+ const exec_1 = require("../system/exec");
4
10
  async function default_1() {
5
- gluegun_1.print.warning('Linux setup is not currently supported');
11
+ gluegun_1.print.info('Setting up Linux tools!');
12
+ const BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'lin', 'release');
13
+ const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'lin');
14
+ const PROFILE_PATH = (0, constants_1.getProfilePath)();
15
+ const spinner = gluegun_1.print.spin();
16
+ spinner.start('Beginning setup...');
17
+ // 0. clone moddable repo into ./local/share directory if it does not exist yet
18
+ gluegun_1.filesystem.dir(constants_1.INSTALL_DIR);
19
+ if (gluegun_1.filesystem.exists(constants_1.EXPORTS_FILE_PATH) === false) {
20
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH, {
21
+ content: `# Generated by xs-dev CLI\n`,
22
+ });
23
+ }
24
+ // 1. Install or update the packages required to compile:
25
+ spinner.start('Installing dependencies...');
26
+ await (0, exec_1.execWithSudo)('apt-get install --yes gcc git wget make libncurses-dev flex bison gperf', { stdout: process.stdout });
27
+ spinner.succeed();
28
+ // 2. Install the development version of the GTK+ 3 library
29
+ spinner.start('Installing GTK+ 3...');
30
+ await (0, exec_1.execWithSudo)('apt-get --yes install libgtk-3-dev', {
31
+ stdout: process.stdout,
32
+ });
33
+ spinner.succeed();
34
+ // 3. Download the Moddable repository, or use the git command line tool as follows:
35
+ if (gluegun_1.filesystem.exists(constants_1.INSTALL_PATH) !== false) {
36
+ spinner.info('Moddable repo already installed');
37
+ }
38
+ else {
39
+ spinner.start('Cloning Moddable-OpenSource/moddable repo');
40
+ await gluegun_1.system.spawn(`git clone ${constants_1.MODDABLE_REPO} ${constants_1.INSTALL_PATH}`);
41
+ spinner.succeed();
42
+ }
43
+ // 4. Setup the MODDABLE environment variable
44
+ process.env.MODDABLE = constants_1.INSTALL_PATH;
45
+ process.env.PATH = `${String(process.env.PATH)}:${BIN_PATH}`;
46
+ await (0, upsert_1.default)(PROFILE_PATH, `source ${constants_1.EXPORTS_FILE_PATH}`);
47
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export MODDABLE=${process.env.MODDABLE}`);
48
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export PATH="${BIN_PATH}:$PATH"`);
49
+ // 5. Build the Moddable command line tools, simulator, and debugger from the command line:
50
+ spinner.start('Building platform tooling');
51
+ await gluegun_1.system.exec('make', { cwd: BUILD_DIR, stdout: process.stdout });
52
+ spinner.succeed();
53
+ // 6. Install the desktop simulator and xsbug debugger applications
54
+ spinner.start('Installing simulator');
55
+ await (0, exec_1.execWithSudo)('make install', {
56
+ cwd: BUILD_DIR,
57
+ stdout: process.stdout,
58
+ });
59
+ spinner.succeed();
60
+ // 7. Profit?
61
+ gluegun_1.print.success('Moddable SDK successfully set up! Start a new terminal session and run the "helloworld example": xs-dev run --example helloworld');
6
62
  }
7
63
  exports.default = default_1;
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9saW51eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUErQjtBQUVoQixLQUFLO0lBQ2xCLGVBQUssQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtBQUN6RCxDQUFDO0FBRkQsNEJBRUMifQ==
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9saW51eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUFtRDtBQUNuRCwyQ0FNb0I7QUFDcEIsZ0VBQXVDO0FBQ3ZDLHlDQUE2QztBQUU5QixLQUFLO0lBQ2xCLGVBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQTtJQUVyQyxNQUFNLFFBQVEsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FDakMsd0JBQVksRUFDWixPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxTQUFTLENBQ1YsQ0FBQTtJQUNELE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNsQyx3QkFBWSxFQUNaLE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxDQUNOLENBQUE7SUFDRCxNQUFNLFlBQVksR0FBRyxJQUFBLDBCQUFjLEdBQUUsQ0FBQTtJQUVyQyxNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBRW5DLCtFQUErRTtJQUMvRSxvQkFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBVyxDQUFDLENBQUE7SUFFM0IsSUFBSSxvQkFBVSxDQUFDLE1BQU0sQ0FBQyw2QkFBaUIsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUNsRCxvQkFBVSxDQUFDLElBQUksQ0FBQyw2QkFBaUIsRUFBRTtZQUNqQyxPQUFPLEVBQUUsNkJBQTZCO1NBQ3ZDLENBQUMsQ0FBQTtLQUNIO0lBRUQseURBQXlEO0lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtJQUMzQyxNQUFNLElBQUEsbUJBQVksRUFDaEIseUVBQXlFLEVBQ3pFLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FDM0IsQ0FBQTtJQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqQiwyREFBMkQ7SUFDM0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sSUFBQSxtQkFBWSxFQUFDLG9DQUFvQyxFQUFFO1FBQ3ZELE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUE7SUFDRixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFakIsb0ZBQW9GO0lBQ3BGLElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsd0JBQVksQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUM3QyxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7S0FDaEQ7U0FBTTtRQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtRQUMxRCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEseUJBQWEsSUFBSSx3QkFBWSxFQUFFLENBQUMsQ0FBQTtRQUNoRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7S0FDbEI7SUFFRCw2Q0FBNkM7SUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsd0JBQVksQ0FBQTtJQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFBO0lBRTVELE1BQU0sSUFBQSxnQkFBTSxFQUFDLFlBQVksRUFBRSxVQUFVLDZCQUFpQixFQUFFLENBQUMsQ0FBQTtJQUV6RCxNQUFNLElBQUEsZ0JBQU0sRUFBQyw2QkFBaUIsRUFBRSxtQkFBbUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sSUFBQSxnQkFBTSxFQUFDLDZCQUFpQixFQUFFLGdCQUFnQixRQUFRLFNBQVMsQ0FBQyxDQUFBO0lBRWxFLDJGQUEyRjtJQUMzRixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDMUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUNyRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFakIsbUVBQW1FO0lBQ25FLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUNyQyxNQUFNLElBQUEsbUJBQVksRUFBQyxjQUFjLEVBQUU7UUFDakMsR0FBRyxFQUFFLFNBQVM7UUFDZCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLGFBQWE7SUFDYixlQUFLLENBQUMsT0FBTyxDQUNYLGtJQUFrSSxDQUNuSSxDQUFBO0FBQ0gsQ0FBQztBQWhGRCw0QkFnRkMifQ==
@@ -8,54 +8,60 @@ const constants_1 = require("./constants");
8
8
  const upsert_1 = __importDefault(require("../patching/upsert"));
9
9
  async function default_1() {
10
10
  gluegun_1.print.info('Setting up the mac tools!');
11
- const MODDABLE_REPO = 'https://github.com/Moddable-OpenSource/moddable';
12
11
  const BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'mac', 'release');
13
12
  const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'mac');
13
+ const PROFILE_PATH = (0, constants_1.getProfilePath)();
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);
27
+ if (gluegun_1.filesystem.exists(constants_1.EXPORTS_FILE_PATH) === false) {
28
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH, {
29
+ content: `# Generated by xs-dev CLI\n`,
30
+ });
31
+ }
25
32
  }
26
33
  catch (error) {
27
- gluegun_1.print.error(`Error setting up install directory: ${String(error)}`);
34
+ spinner.fail(`Error setting up install directory: ${String(error)}`);
28
35
  process.exit(1);
29
36
  }
30
37
  if (gluegun_1.filesystem.exists(constants_1.INSTALL_PATH) !== false) {
31
- gluegun_1.print.info('Moddable repo already installed');
38
+ spinner.info('Moddable repo already installed');
32
39
  }
33
40
  else {
34
41
  try {
35
- await gluegun_1.system.spawn(`git clone ${MODDABLE_REPO} ${constants_1.INSTALL_PATH}`);
42
+ spinner.start('Cloning Moddable-OpenSource/moddable repo');
43
+ await gluegun_1.system.spawn(`git clone ${constants_1.MODDABLE_REPO} ${constants_1.INSTALL_PATH}`);
44
+ spinner.succeed();
36
45
  }
37
46
  catch (error) {
38
- gluegun_1.print.error(`Error cloning moddable repo: ${String(error)}`);
47
+ spinner.fail(`Error cloning moddable repo: ${String(error)}`);
39
48
  process.exit(1);
40
49
  }
41
50
  }
42
51
  // 2. configure MODDABLE env variable, add release binaries dir to PATH
43
- if (process.env.MODDABLE === undefined) {
44
- process.env.MODDABLE = constants_1.INSTALL_PATH;
45
- 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"`);
48
- }
49
- else {
50
- gluegun_1.print.info(`Using current MODDABLE env: ${process.env.MODDABLE}`);
51
- }
52
+ process.env.MODDABLE = constants_1.INSTALL_PATH;
53
+ process.env.PATH = `${String(process.env.PATH)}:${BIN_PATH}`;
54
+ await (0, upsert_1.default)(PROFILE_PATH, `source ${constants_1.EXPORTS_FILE_PATH}`);
55
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export MODDABLE=${process.env.MODDABLE}`);
56
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export PATH="${BIN_PATH}:$PATH"`);
52
57
  // 3. cd into makefiles dir for platform, run `make`
53
58
  try {
54
- const dir = gluegun_1.filesystem.cwd(gluegun_1.filesystem.resolve(BUILD_DIR));
55
- await gluegun_1.system.spawn('make', { cwd: dir.cwd() });
59
+ spinner.start('Building platform tooling');
60
+ await gluegun_1.system.exec('make', { cwd: BUILD_DIR });
61
+ spinner.succeed();
56
62
  }
57
63
  catch (error) {
58
- gluegun_1.print.error(`Error building mac tooling: ${String(error)}`);
64
+ spinner.fail(`Error building mac tooling: ${String(error)}`);
59
65
  process.exit(1);
60
66
  }
61
67
  // 4. symlink xsbug.app into user applications directory
@@ -64,14 +70,14 @@ async function default_1() {
64
70
  }
65
71
  catch (error) {
66
72
  if (!String(error).includes('exists')) {
67
- gluegun_1.print.error(`Issue creating symlink for xsbug.app: ${String(error)}`);
73
+ spinner.fail(`Issue creating symlink for xsbug.app: ${String(error)}`);
68
74
  process.exit(1);
69
75
  }
70
76
  else {
71
- gluegun_1.print.info('xsbug.app symlink already exists');
77
+ spinner.info('xsbug.app symlink already exists');
72
78
  }
73
79
  }
74
- gluegun_1.print.success('Moddable SDK successfully set up! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
80
+ spinner.succeed('Moddable SDK successfully set up! Start a new terminal session and run the "helloworld example": xs-dev run --example helloworld');
75
81
  }
76
82
  exports.default = default_1;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvbWFjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUNBQW1EO0FBQ25ELDJDQUFxRTtBQUNyRSxnRUFBdUM7QUFFeEIsS0FBSztJQUNsQixlQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDdkMsTUFBTSxhQUFhLEdBQUcsaURBQWlELENBQUE7SUFFdkUsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQ2pDLHdCQUFZLEVBQ1osT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUE7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FDbEMsd0JBQVksRUFDWixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTixDQUFBO0lBRUQsdURBQXVEO0lBQ3ZELElBQUk7UUFDRixNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUE7S0FDdEM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLGVBQUssQ0FBQyxLQUFLLENBQ1QsNEZBQTRGLENBQzdGLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsK0VBQStFO0lBQy9FLElBQUk7UUFDRixvQkFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBVyxDQUFDLENBQUE7S0FDNUI7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLGVBQUssQ0FBQyxLQUFLLENBQUMsdUNBQXVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsd0JBQVksQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUM3QyxlQUFLLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7S0FDOUM7U0FBTTtRQUNMLElBQUk7WUFDRixNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsYUFBYSxJQUFJLHdCQUFZLEVBQUUsQ0FBQyxDQUFBO1NBQ2pFO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxlQUFLLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDaEI7S0FDRjtJQUVELHVFQUF1RTtJQUN2RSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyx3QkFBWSxDQUFBO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUE7UUFFNUQsTUFBTSxJQUFBLGdCQUFNLEVBQUMsd0JBQVksRUFBRSxtQkFBbUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sSUFBQSxnQkFBTSxFQUFDLHdCQUFZLEVBQUUsZ0JBQWdCLFFBQVEsU0FBUyxDQUFDLENBQUE7S0FDOUQ7U0FBTTtRQUNMLGVBQUssQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUNsRTtJQUVELG9EQUFvRDtJQUNwRCxJQUFJO1FBQ0YsTUFBTSxHQUFHLEdBQUcsb0JBQVUsQ0FBQyxHQUFHLENBQUMsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUN6RCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0tBQy9DO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxlQUFLLENBQUMsS0FBSyxDQUFDLCtCQUErQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCx3REFBd0Q7SUFDeEQsSUFBSTtRQUNGLG9CQUFVLENBQUMsT0FBTyxDQUNoQixvQkFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQ3pDLHlCQUF5QixDQUMxQixDQUFBO0tBQ0Y7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLGVBQUssQ0FBQyxLQUFLLENBQUMseUNBQXlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUNoQjthQUFNO1lBQ0wsZUFBSyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1NBQy9DO0tBQ0Y7SUFFRCxlQUFLLENBQUMsT0FBTyxDQUNYLHlIQUF5SCxDQUMxSCxDQUFBO0FBQ0gsQ0FBQztBQXJGRCw0QkFxRkMifQ==
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvbWFjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUNBQW1EO0FBQ25ELDJDQU1vQjtBQUNwQixnRUFBdUM7QUFFeEIsS0FBSztJQUNsQixlQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFFdkMsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQ2pDLHdCQUFZLEVBQ1osT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUE7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FDbEMsd0JBQVksRUFDWixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTixDQUFBO0lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBQSwwQkFBYyxHQUFFLENBQUE7SUFFckMsdURBQXVEO0lBQ3ZELElBQUk7UUFDRixNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7S0FDckM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLGVBQUssQ0FBQyxLQUFLLENBQ1QsNEZBQTRGLENBQzdGLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUVuQywrRUFBK0U7SUFDL0UsSUFBSTtRQUNGLG9CQUFVLENBQUMsR0FBRyxDQUFDLHVCQUFXLENBQUMsQ0FBQTtRQUUzQixJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLDZCQUFpQixDQUFDLEtBQUssS0FBSyxFQUFFO1lBQ2xELG9CQUFVLENBQUMsSUFBSSxDQUFDLDZCQUFpQixFQUFFO2dCQUNqQyxPQUFPLEVBQUUsNkJB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
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.moddableExists = void 0;
4
+ const gluegun_1 = require("gluegun");
5
+ function moddableExists() {
6
+ return (process.env.MODDABLE !== undefined &&
7
+ gluegun_1.filesystem.exists(process.env.MODDABLE) === 'dir');
8
+ }
9
+ exports.moddableExists = moddableExists;
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9tb2RkYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBb0M7QUFFcEMsU0FBZ0IsY0FBYztJQUM1QixPQUFPLENBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUztRQUNsQyxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FDbEQsQ0FBQTtBQUNILENBQUM7QUFMRCx3Q0FLQyJ9
@@ -4,62 +4,99 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const gluegun_1 = require("gluegun");
7
+ const os_1 = require("os");
7
8
  const constants_1 = require("./constants");
9
+ const moddable_1 = require("./moddable");
8
10
  const upsert_1 = __importDefault(require("../patching/upsert"));
11
+ const exec_1 = require("../system/exec");
9
12
  async function default_1() {
13
+ const OS = (0, os_1.type)().toLowerCase();
10
14
  const EMSDK_REPO = 'https://github.com/emscripten-core/emsdk.git';
11
15
  const BINARYEN_REPO = 'https://github.com/WebAssembly/binaryen.git';
12
16
  const WASM_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'wasm');
13
17
  const EMSDK_PATH = gluegun_1.filesystem.resolve(WASM_DIR, 'emsdk');
14
18
  const BINARYEN_PATH = gluegun_1.filesystem.resolve(WASM_DIR, 'binaryen');
15
- gluegun_1.print.info('Setting up wasm simulator tools');
19
+ const spinner = gluegun_1.print.spin({ stream: process.stdout });
20
+ spinner.start('Setting up wasm simulator tools');
16
21
  // 0. ensure wasm instal directory and Moddable exists
17
- if (process.env.MODDABLE === undefined) {
18
- gluegun_1.print.warning('Moddable tooling required. Run `xs-dev setup` before trying again.');
22
+ if (!(0, moddable_1.moddableExists)()) {
23
+ spinner.fail('Moddable platform tooling required. Run `xs-dev setup` before trying again.');
19
24
  process.exit(1);
20
25
  }
21
- gluegun_1.print.info('Ensuring wasm directory');
26
+ spinner.info('Ensuring wasm directory');
22
27
  gluegun_1.filesystem.dir(WASM_DIR);
28
+ gluegun_1.filesystem.file(constants_1.EXPORTS_FILE_PATH);
23
29
  // 1. Clone EM_SDK repo, install, and activate latest version
24
30
  if (gluegun_1.filesystem.exists(EMSDK_PATH) === false) {
25
- gluegun_1.print.info('Cloning emsdk repo');
31
+ spinner.start('Cloning emsdk repo');
32
+ await gluegun_1.system.spawn(`git clone ${EMSDK_REPO} ${EMSDK_PATH}`);
33
+ spinner.succeed();
34
+ }
35
+ if (process.env.EMSDK === undefined) {
26
36
  try {
27
- await gluegun_1.system.spawn(`git clone ${EMSDK_REPO} ${EMSDK_PATH}`);
28
- await gluegun_1.system.spawn('./emsdk install latest', {
37
+ spinner.start('Installing latest EMSDK');
38
+ await gluegun_1.system.exec('./emsdk install latest', {
29
39
  cwd: EMSDK_PATH,
40
+ stdout: process.stdout,
30
41
  });
31
- await gluegun_1.system.spawn('./emsdk activate latest', {
42
+ await gluegun_1.system.exec('./emsdk activate latest', {
32
43
  cwd: EMSDK_PATH,
44
+ stdout: process.stdout,
33
45
  });
46
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `source ${gluegun_1.filesystem.resolve(EMSDK_PATH, 'emsdk_env.sh')}`);
34
47
  }
35
48
  catch (error) {
36
- gluegun_1.print.error(`Error activating emsdk: ${String(error)}`);
49
+ spinner.fail(`Error activating emsdk: ${String(error)}`);
37
50
  process.exit(1);
38
51
  }
39
52
  }
53
+ spinner.succeed('emsdk setup complete');
40
54
  // 2. Clone Binaryen repo and build
41
55
  if (gluegun_1.filesystem.exists(BINARYEN_PATH) === false) {
42
- gluegun_1.print.info('Cloning binaryen repo');
43
- await gluegun_1.system.spawn(`git clone ${BINARYEN_REPO} ${BINARYEN_PATH}`);
44
- 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');
56
+ spinner.start('Cloning binaryen repo');
57
+ await gluegun_1.system.spawn(`git clone --recursive ${BINARYEN_REPO} ${BINARYEN_PATH}`);
58
+ spinner.succeed();
59
+ }
60
+ if (gluegun_1.system.which('cmake') === null) {
61
+ if (OS === 'darwin') {
62
+ spinner.start('Cmake required, installing with Homebrew');
63
+ await gluegun_1.system.exec('brew install cmake');
47
64
  }
48
- await gluegun_1.system.spawn('cmake . && make', {
49
- cwd: BINARYEN_PATH,
50
- });
65
+ if (OS === 'linux') {
66
+ spinner.start('Cmake required, installing with apt');
67
+ await (0, exec_1.execWithSudo)('apt --yes install cmake');
68
+ }
69
+ spinner.succeed();
51
70
  }
71
+ spinner.start('Building Binaryen tooling');
72
+ await gluegun_1.system.exec('cmake .', {
73
+ cwd: BINARYEN_PATH,
74
+ stdout: process.stdout,
75
+ });
76
+ spinner.succeed('cmake complete');
77
+ spinner.start('Start make process, this could take a couple minutes');
78
+ await gluegun_1.system.exec('make', {
79
+ cwd: BINARYEN_PATH,
80
+ stdout: process.stdout,
81
+ });
82
+ spinner.succeed();
52
83
  // 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`);
84
+ spinner.info('Sourcing adding binaryen to PATH');
85
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export PATH=${gluegun_1.filesystem.resolve(BINARYEN_PATH, 'bin')}:$PATH`);
56
86
  process.env.PATH = `${String(process.env.PATH)}:${gluegun_1.filesystem.resolve(BINARYEN_PATH, 'bin')}`;
57
87
  // 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'),
88
+ if (gluegun_1.filesystem.exists(gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'bin', 'wasm')) === false) {
89
+ spinner.start('Building Moddable wasm tools');
90
+ await gluegun_1.system.exec(`make`, {
91
+ cwd: gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'makefiles', 'wasm'),
92
+ stdout: process.stdout,
93
+ });
94
+ }
95
+ await gluegun_1.system.exec(`source ${constants_1.EXPORTS_FILE_PATH}`, {
96
+ shell: process.env.SHELL,
97
+ stdout: process.stdout,
61
98
  });
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`);
99
+ 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
100
  }
64
101
  exports.default = default_1;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsMkNBQXVEO0FBQ3ZELGdFQUF1QztBQUV4QixLQUFLO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLDhDQUE4QyxDQUFBO0lBQ2pFLE1BQU0sYUFBYSxHQUFHLDZDQUE2QyxDQUFBO0lBQ25FLE1BQU0sUUFBUSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLHVCQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDeEQsTUFBTSxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sYUFBYSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUU5RCxlQUFLLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7SUFFN0Msc0RBQXNEO0lBQ3RELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3RDLGVBQUssQ0FBQyxPQUFPLENBQ1gsb0VBQW9FLENBQ3JFLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBQ0QsZUFBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO0lBQ3JDLG9CQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXhCLDZEQUE2RDtJQUM3RCxJQUFJLG9CQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUMzQyxlQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDaEMsSUFBSTtZQUNGLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxVQUFVLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUMzRCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO2dCQUMzQyxHQUFHLEVBQUUsVUFBVTthQUNoQixDQUFDLENBQUE7WUFDRixNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFO2dCQUM1QyxHQUFHLEVBQUUsVUFBVTthQUNoQixDQUFDLENBQUE7U0FDSDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsZUFBSyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO0tBQ0Y7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDOUMsZUFBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ25DLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxhQUFhLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUVqRSxJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsQyxlQUFLLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUE7WUFDdEQsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1NBQ3pDO1FBRUQsTUFBTSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQyxHQUFHLEVBQUUsYUFBYTtTQUNuQixDQUFDLENBQUE7S0FDSDtJQUVELDBEQUEwRDtJQUMxRCxlQUFLLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxDQUFDLENBQUE7SUFDcEUsTUFBTSxJQUFBLGdCQUFNLEVBQ1Ysd0JBQVksRUFDWixVQUFVLG9CQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUMzRCxDQUFBO0lBQ0QsTUFBTSxJQUFBLGdCQUFNLEVBQ1Ysd0JBQVksRUFDWixlQUFlLG9CQUFVLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUNoRSxDQUFBO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBVSxDQUFDLE9BQU8sQ0FDbEUsYUFBYSxFQUNiLEtBQUssQ0FDTixFQUFFLENBQUE7SUFFSCwrQkFBK0I7SUFDL0IsZUFBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ3pCLEdBQUcsRUFBRSxvQkFBVSxDQUFDLE9BQU8sQ0FDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQzVCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsTUFBTSxDQUNQO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsZUFBSyxDQUFDLE9BQU8sQ0FDWCxrS0FBa0ssQ0FDbkssQ0FBQTtBQUNILENBQUM7QUFoRkQsNEJBZ0ZDIn0=
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsMkJBQXlDO0FBQ3pDLDJDQUE0RDtBQUM1RCx5Q0FBMkM7QUFDM0MsZ0VBQXVDO0FBQ3ZDLHlDQUE2QztBQUU5QixLQUFLO0lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUEsU0FBWSxHQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDdkMsTUFBTSxVQUFVLEdBQUcsOENBQThDLENBQUE7SUFDakUsTUFBTSxhQUFhLEdBQUcsNkNBQTZDLENBQUE7SUFDbkUsTUFBTSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN4RCxNQUFNLFVBQVUsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDeEQsTUFBTSxhQUFhLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRTlELE1BQU0sT0FBTyxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDdEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO0lBRWhELHNEQUFzRDtJQUN0RCxJQUFJLENBQUMsSUFBQSx5QkFBYyxHQUFFLEVBQUU7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FDViw2RUFBNkUsQ0FDOUUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUE7SUFDdkMsb0JBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDeEIsb0JBQVUs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
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.execWithSudo = void 0;
4
+ const gluegun_1 = require("gluegun");
5
+ function ensureAskPass() {
6
+ const SUDO_ASKPASS = gluegun_1.system.which('ssh-askpass');
7
+ if (SUDO_ASKPASS === undefined) {
8
+ gluegun_1.print.warning('ssh-askpass required to prompt for password');
9
+ process.exit(1);
10
+ }
11
+ process.env.SUDO_ASKPASS = SUDO_ASKPASS;
12
+ }
13
+ /**
14
+ * Ensure command can be run with sudo,
15
+ * first attempting as non-interactive before falling back to ssh-askpass prompt
16
+ **/
17
+ async function execWithSudo(command, options = {}) {
18
+ try {
19
+ await gluegun_1.system.exec(`sudo --non-interactive --preserve-env ${command}`, options);
20
+ return;
21
+ }
22
+ catch (error) {
23
+ if (error.toString().includes('password') === false) {
24
+ ensureAskPass();
25
+ }
26
+ else {
27
+ throw error;
28
+ }
29
+ }
30
+ await gluegun_1.system.exec(`sudo --askpass --preserve-env ${command}`, options);
31
+ }
32
+ exports.execWithSudo = execWithSudo;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3N5c3RlbS9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUF1QztBQUV2QyxTQUFTLGFBQWE7SUFDcEIsTUFBTSxZQUFZLEdBQUcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDaEQsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1FBQzlCLGVBQUssQ0FBQyxPQUFPLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtRQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0FBQ3pDLENBQUM7QUFFRDs7O0lBR0k7QUFDRyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxPQUFlLEVBQ2YsVUFBbUMsRUFBRTtJQUVyQyxJQUFJO1FBQ0YsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDZix5Q0FBeUMsT0FBTyxFQUFFLEVBQ2xELE9BQU8sQ0FDUixDQUFBO1FBQ0QsT0FBTTtLQUNQO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQ25ELGFBQWEsRUFBRSxDQUFBO1NBQ2hCO2FBQU07WUFDTCxNQUFNLEtBQUssQ0FBQTtTQUNaO0tBQ0Y7SUFFRCxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUN4RSxDQUFDO0FBbkJELG9DQW1CQyJ9
@@ -1,8 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const gluegun_1 = require("gluegun");
4
+ const constants_1 = require("../setup/constants");
4
5
  async function default_1() {
5
- gluegun_1.print.warning('Linux update is not currently supported');
6
+ gluegun_1.print.info('Checking for SDK changes');
7
+ const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'mac');
8
+ const currentRev = await gluegun_1.system.exec('git rev-parse public', {
9
+ cwd: process.env.MODDABLE,
10
+ });
11
+ const remoteRev = await gluegun_1.system.exec('git ls-remote origin refs/heads/public', { cwd: process.env.MODDABLE });
12
+ if (remoteRev.split('\t').shift() === currentRev.trim()) {
13
+ gluegun_1.print.success('Moddable SDK already up to date!');
14
+ process.exit(0);
15
+ }
16
+ const spinner = gluegun_1.print.spin();
17
+ spinner.start('Updating Moddable SDK!');
18
+ spinner.start('Stashing any unsaved changes before committing');
19
+ await gluegun_1.system.exec('git stash', { cwd: process.env.MODDABLE });
20
+ await gluegun_1.system.exec('git pull origin public', { cwd: process.env.MODDABLE });
21
+ await gluegun_1.system.exec('rm -rf build/{tmp,bin}', { cwd: process.env.MODDABLE });
22
+ spinner.succeed();
23
+ spinner.start('Rebuilding platform tools');
24
+ await gluegun_1.system.exec('make', {
25
+ cwd: BUILD_DIR,
26
+ stdout: process.stdout,
27
+ });
28
+ spinner.succeed();
29
+ spinner.start('Reinstalling simulator');
30
+ await gluegun_1.system.exec('make install', {
31
+ cwd: BUILD_DIR,
32
+ stdout: process.stdout,
33
+ stdin: process.stdin,
34
+ });
35
+ spinner.succeed();
36
+ gluegun_1.print.success('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
6
37
  }
7
38
  exports.default = default_1;
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC91cGRhdGUvbGludXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBK0I7QUFFaEIsS0FBSztJQUNsQixlQUFLLENBQUMsT0FBTyxDQUFDLHlDQUF5QyxDQUFDLENBQUE7QUFDMUQsQ0FBQztBQUZELDRCQUVDIn0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC91cGRhdGUvbGludXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQWlEO0FBRWxDLEtBQUs7SUFDbEIsZUFBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNsQyx3QkFBWSxFQUNaLE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxDQUNOLENBQUE7SUFFRCxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDL0QsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqQixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDMUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDeEIsR0FBRyxFQUFFLFNBQVM7UUFDZCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUN2QyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtRQUNoQyxHQUFHLEVBQUUsU0FBUztRQUNkLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7S0FDckIsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLGVBQUssQ0FBQyxPQUFPLENBQ1gsMEhBQTBILENBQzNILENBQUE7QUFDSCxDQUFDO0FBbERELDRCQWtEQyJ9
@@ -13,15 +13,17 @@ 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'),
24
+ stdout: process.stdout,
23
25
  });
24
26
  spinner.succeed('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
25
27
  }
26
28
  exports.default = default_1;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvdXBkYXRlL21hYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUFtRDtBQUVwQyxLQUFLO0lBQ2xCLGVBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUV0QyxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDOUQsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUN6QyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUN4QixHQUFHLEVBQUUsb0JBQVUsQ0FBQyxPQUFPLENBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUM1QixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTjtLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxPQUFPLENBQ2IsMEhBQTBILENBQzNILENBQUE7QUFDSCxDQUFDO0FBdENELDRCQXNDQyJ9
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvdXBkYXRlL21hYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUFtRDtBQUVwQyxLQUFLO0lBQ2xCLGVBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUV0QyxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDL0QsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqQixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDMUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDeEIsR0FBRyxFQUFFLG9CQUFVLENBQUMsT0FBTyxDQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFDNUIsT0FBTyxFQUNQLFdBQVcsRUFDWCxLQUFLLENBQ047UUFDRCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFBO0lBRUYsT0FBTyxDQUFDLE9BQU8sQ0FDYiwwSEFBMEgsQ0FDM0gsQ0FBQTtBQUNILENBQUM7QUF4Q0QsNEJBd0NDIn0=
@@ -0,0 +1,3 @@
1
+ import type { GluegunCommand } from 'gluegun';
2
+ declare const command: GluegunCommand;
3
+ export default command;
@@ -1,5 +1,6 @@
1
1
  export declare const HOME_DIR: string;
2
2
  export declare const INSTALL_DIR: string;
3
3
  export declare const INSTALL_PATH: string;
4
- export declare const PROFILE: string;
5
- export declare const PROFILE_PATH: string;
4
+ export declare const EXPORTS_FILE_PATH: string;
5
+ export declare const MODDABLE_REPO = "https://github.com/Moddable-OpenSource/moddable";
6
+ export declare function getProfilePath(): string;
@@ -0,0 +1,2 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
@@ -0,0 +1 @@
1
+ export declare function moddableExists(): boolean;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Ensure command can be run with sudo,
3
+ * first attempting as non-interactive before falling back to ssh-askpass prompt
4
+ **/
5
+ export declare function execWithSudo(command: string, options?: Record<string, unknown>): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xs-dev",
3
- "version": "0.0.1",
3
+ "version": "0.3.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 setup / update / teardown\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\nRemove all setup and environment changes with teardown command:\n\n```\nxs-dev teardown\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 using `pnpm`, which will override any other globally installed version:\n\n```\npnpm link --global\npnpm link --global xs-dev\n```\n\nOr create an alias to clearly denote the local version of the CLI:\n\n```\nalias local-xs-dev=$PWD/bin/xs-dev\n```\n\nTo maintain the alias between shell sessions, for example I use zsh:\n\n```\necho \"alias local-xs-dev=$PWD/bin/xs-dev\" >> ~/.zshrc\n```\n"
69
74
  }