xs-dev 0.17.0 → 0.18.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 +1 -1
- package/build/toolbox/setup/constants.js +10 -3
- package/build/toolbox/setup/esp32/windows.js +42 -0
- package/build/toolbox/setup/esp32.js +48 -19
- package/build/toolbox/setup/esp8266/windows.js +84 -0
- package/build/toolbox/setup/esp8266.js +44 -16
- package/build/toolbox/setup/windows.js +166 -2
- package/build/types/toolbox/setup/esp32/windows.d.ts +3 -0
- package/build/types/toolbox/setup/esp8266/windows.d.ts +3 -0
- package/build/types/toolbox/setup/windows.d.ts +5 -0
- package/docs/src/components/HeadCommon.astro +4 -4
- package/docs/src/components/RightSidebar/RightSidebar.astro +2 -3
- package/docs/src/components/RightSidebar/TableOfContents.tsx +50 -43
- package/docs/src/layouts/MainLayout.astro +2 -2
- package/docs/src/pages/en/guide/00-prepare.md +4 -0
- package/docs/src/pages/en/guide/01-hello-console.md +1 -1
- package/docs/tsconfig.json +2 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -3,10 +3,17 @@ var _a;
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
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
|
+
const os_1 = require("os");
|
|
7
|
+
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
8
|
+
const isWindows = currentPlatform === 'windows_nt';
|
|
6
9
|
exports.HOME_DIR = gluegun_1.filesystem.homedir();
|
|
7
|
-
exports.INSTALL_DIR =
|
|
10
|
+
exports.INSTALL_DIR = isWindows
|
|
11
|
+
? gluegun_1.filesystem.resolve(exports.HOME_DIR, 'xs-dev')
|
|
12
|
+
: gluegun_1.filesystem.resolve(exports.HOME_DIR, '.local', 'share');
|
|
8
13
|
exports.INSTALL_PATH = (_a = process.env.MODDABLE) !== null && _a !== void 0 ? _a : gluegun_1.filesystem.resolve(exports.INSTALL_DIR, 'moddable');
|
|
9
|
-
exports.EXPORTS_FILE_PATH =
|
|
14
|
+
exports.EXPORTS_FILE_PATH = isWindows
|
|
15
|
+
? gluegun_1.filesystem.resolve(exports.INSTALL_DIR, 'Moddable.bat')
|
|
16
|
+
: gluegun_1.filesystem.resolve(exports.HOME_DIR, '.local', 'share', 'xs-dev-export.sh');
|
|
10
17
|
exports.MODDABLE_REPO = 'https://github.com/Moddable-OpenSource/moddable';
|
|
11
18
|
function getProfilePath() {
|
|
12
19
|
var _a;
|
|
@@ -26,4 +33,4 @@ function getProfilePath() {
|
|
|
26
33
|
return profilePath;
|
|
27
34
|
}
|
|
28
35
|
exports.getProfilePath = getProfilePath;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxQ0FBb0M7QUFDcEMsMkJBQXlDO0FBR3pDLE1BQU0sZUFBZSxHQUFXLElBQUEsU0FBWSxHQUFFLENBQUMsV0FBVyxFQUFZLENBQUE7QUFDdEUsTUFBTSxTQUFTLEdBQUcsZUFBZSxLQUFLLFlBQVksQ0FBQTtBQUVyQyxRQUFBLFFBQVEsR0FBRyxvQkFBVSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQy9CLFFBQUEsV0FBVyxHQUFHLFNBQVM7SUFDbEMsQ0FBQyxDQUFDLG9CQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUN0QyxRQUFBLFlBQVksR0FDdkIsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUN4RCxRQUFBLGlCQUFpQixHQUFHLFNBQVM7SUFDeEMsQ0FBQyxDQUFDLG9CQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFXLEVBQUUsY0FBYyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUMxRCxRQUFBLGFBQWEsR0FBRyxpREFBaUQsQ0FBQTtBQUM5RSxTQUFnQixjQUFjOztJQUM1QixNQUFNLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUE7SUFDckMsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFBO0lBRXhCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN6QixPQUFPLEdBQUcsUUFBUSxDQUFBO0tBQ25CO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzFCLE9BQU8sR0FBRyxTQUFTLENBQUE7S0FDcEI7SUFFRCxJQUFJLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZELElBQUksb0JBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTTtRQUFFLE9BQU8sV0FBVyxDQUFBO0lBRWpFLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3RELG9CQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzVCLE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFqQkQsd0NBaUJDIn0=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.esp32Exists = exports.installDeps = void 0;
|
|
7
|
+
const gluegun_1 = require("gluegun");
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const util_1 = require("util");
|
|
10
|
+
const stream_1 = require("stream");
|
|
11
|
+
const finishedPromise = (0, util_1.promisify)(stream_1.finished);
|
|
12
|
+
const IDF_INSTALLER = 'https://github.com/espressif/idf-installer/releases/download/online-2.15/esp-idf-tools-setup-online-2.15.exe';
|
|
13
|
+
async function installDeps(spinner, ESP32_DIR, IDF_PATH) {
|
|
14
|
+
var _a;
|
|
15
|
+
if (esp32Exists()) {
|
|
16
|
+
gluegun_1.print.info(`ESP-IDF tooling exists at ${(_a = process.env.IDF_PATH) !== null && _a !== void 0 ? _a : ''}`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
spinner.start('Downloading ESP-IDF Tools Installer');
|
|
20
|
+
const destination = gluegun_1.filesystem.resolve(ESP32_DIR, 'esp-idf-tools-setup-online-2.15.exe');
|
|
21
|
+
const writer = gluegun_1.filesystem.createWriteStream(destination);
|
|
22
|
+
const response = await axios_1.default.get(IDF_INSTALLER, {
|
|
23
|
+
responseType: 'stream',
|
|
24
|
+
});
|
|
25
|
+
response.data.pipe(writer);
|
|
26
|
+
await finishedPromise(writer);
|
|
27
|
+
spinner.succeed();
|
|
28
|
+
gluegun_1.print.info(`When prompted, select "Use an Existing ESP-IDF Directory" and choose ${IDF_PATH}.`);
|
|
29
|
+
gluegun_1.print.info('The "Full Installation" option is recommended.');
|
|
30
|
+
spinner.start('Running ESP-IDF Tools Installer');
|
|
31
|
+
await gluegun_1.system.exec(`start /B ${destination}`);
|
|
32
|
+
spinner.succeed();
|
|
33
|
+
}
|
|
34
|
+
exports.installDeps = installDeps;
|
|
35
|
+
function esp32Exists() {
|
|
36
|
+
return (process.env.IDF_PATH !== undefined &&
|
|
37
|
+
process.env.IDF_TOOLS_PATH !== undefined &&
|
|
38
|
+
gluegun_1.filesystem.exists(process.env.IDF_TOOLS_PATH) === 'dir' &&
|
|
39
|
+
gluegun_1.filesystem.exists(process.env.IDF_PATH) === 'dir');
|
|
40
|
+
}
|
|
41
|
+
exports.esp32Exists = esp32Exists;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDMyL3dpbmRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUNBQW1EO0FBRW5ELGtEQUF5QjtBQUN6QiwrQkFBZ0M7QUFDaEMsbUNBQWlDO0FBRWpDLE1BQU0sZUFBZSxHQUFHLElBQUEsZ0JBQVMsRUFBQyxpQkFBUSxDQUFDLENBQUE7QUFFM0MsTUFBTSxhQUFhLEdBQ2pCLDhHQUE4RyxDQUFBO0FBRXpHLEtBQUssVUFBVSxXQUFXLENBQy9CLE9BQXlDLEVBQ3pDLFNBQWlCLEVBQ2pCLFFBQWdCOztJQUVoQixJQUFJLFdBQVcsRUFBRSxFQUFFO1FBQ2pCLGVBQUssQ0FBQyxJQUFJLENBQUMsNkJBQTZCLE1BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLG1DQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDckUsT0FBTTtLQUNQO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ3BELE1BQU0sV0FBVyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNwQyxTQUFTLEVBQ1QscUNBQXFDLENBQ3RDLENBQUE7SUFDRCxNQUFNLE1BQU0sR0FBRyxvQkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7UUFDOUMsWUFBWSxFQUFFLFFBQVE7S0FDdkIsQ0FBQyxDQUFBO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUIsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLGVBQUssQ0FBQyxJQUFJLENBQ1Isd0VBQXdFLFFBQVEsR0FBRyxDQUNwRixDQUFBO0lBQ0QsZUFBSyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUNoRCxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksV0FBVyxFQUFFLENBQUMsQ0FBQTtJQUM1QyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDbkIsQ0FBQztBQTlCRCxrQ0E4QkM7QUFFRCxTQUFnQixXQUFXO0lBQ3pCLE9BQU8sQ0FDTCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLFNBQVM7UUFDeEMsb0JBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLO1FBQ3ZELG9CQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxDQUNsRCxDQUFBO0FBQ0gsQ0FBQztBQVBELGtDQU9DIn0=
|
|
@@ -10,8 +10,11 @@ const moddable_1 = require("./moddable");
|
|
|
10
10
|
const upsert_1 = __importDefault(require("../patching/upsert"));
|
|
11
11
|
const mac_1 = require("./esp32/mac");
|
|
12
12
|
const linux_1 = require("./esp32/linux");
|
|
13
|
+
const windows_1 = require("./esp32/windows");
|
|
14
|
+
const windows_2 = require("./windows");
|
|
13
15
|
async function default_1() {
|
|
14
16
|
const OS = (0, os_1.type)().toLowerCase();
|
|
17
|
+
const isWindows = OS === 'windows_nt';
|
|
15
18
|
const ESP_IDF_REPO = 'https://github.com/espressif/esp-idf.git';
|
|
16
19
|
const ESP_BRANCH = 'v4.4.2';
|
|
17
20
|
const ESP32_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'esp32');
|
|
@@ -23,6 +26,8 @@ async function default_1() {
|
|
|
23
26
|
spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
|
|
24
27
|
process.exit(1);
|
|
25
28
|
}
|
|
29
|
+
if (isWindows)
|
|
30
|
+
await (0, windows_2.ensureModdableCommandPrompt)(spinner);
|
|
26
31
|
// 1. ensure ~/.local/share/esp32 directory
|
|
27
32
|
spinner.info('Ensuring esp32 install directory');
|
|
28
33
|
gluegun_1.filesystem.dir(ESP32_DIR);
|
|
@@ -40,31 +45,55 @@ async function default_1() {
|
|
|
40
45
|
if (OS === 'linux') {
|
|
41
46
|
await (0, linux_1.installDeps)(spinner);
|
|
42
47
|
}
|
|
48
|
+
if (isWindows) {
|
|
49
|
+
await (0, windows_1.installDeps)(spinner, ESP32_DIR, IDF_PATH);
|
|
50
|
+
}
|
|
43
51
|
// 4. append IDF_PATH env export to shell profile
|
|
44
|
-
if (
|
|
45
|
-
spinner.info('Configuring
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
if (isWindows) {
|
|
53
|
+
spinner.info('Configuring IDF_PATH environment variable');
|
|
54
|
+
await (0, windows_2.setEnv)('IDF_PATH', IDF_PATH);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (process.env.IDF_PATH === undefined) {
|
|
58
|
+
spinner.info('Configuring $IDF_PATH');
|
|
59
|
+
process.env.IDF_PATH = IDF_PATH;
|
|
60
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export IDF_PATH=${IDF_PATH}`);
|
|
61
|
+
}
|
|
48
62
|
}
|
|
49
63
|
// 5. cd to IDF_PATH, run install.sh
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
if (isWindows) {
|
|
65
|
+
spinner.start('Running ESP-IDF Tools install.bat');
|
|
66
|
+
await gluegun_1.system.exec(`${IDF_PATH}\\install.bat`, {
|
|
67
|
+
cwd: IDF_PATH,
|
|
68
|
+
stdout: process.stdout,
|
|
69
|
+
});
|
|
70
|
+
spinner.succeed();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
spinner.start('Installing esp-idf tooling');
|
|
74
|
+
await gluegun_1.system.exec('./install.sh', {
|
|
75
|
+
cwd: IDF_PATH,
|
|
76
|
+
shell: process.env.SHELL,
|
|
77
|
+
stdout: process.stdout,
|
|
78
|
+
});
|
|
79
|
+
spinner.succeed();
|
|
80
|
+
}
|
|
57
81
|
// 6. append 'source $IDF_PATH/export.sh' to shell profile
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
82
|
+
if (isWindows) {
|
|
83
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `pushd %IDF_PATH% && call "%IDF_TOOLS_PATH%\\idf_cmd_init.bat" && popd`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
spinner.info('Sourcing esp-idf environment');
|
|
87
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `source $IDF_PATH/export.sh 1> /dev/null`);
|
|
88
|
+
await gluegun_1.system.exec('source $IDF_PATH/export.sh', {
|
|
89
|
+
shell: process.env.SHELL,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
63
92
|
spinner.succeed(`
|
|
64
93
|
Successfully set up esp32 platform support for Moddable!
|
|
65
|
-
Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device=esp32
|
|
66
|
-
If there is trouble finding the correct port, pass the "--port" flag to the above command with the path to the
|
|
94
|
+
Test out the setup by starting a new ${isWindows ? 'Moddable Command Prompt' : 'terminal session'}, plugging in your device, and running: xs-dev run --example helloworld --device=esp32
|
|
95
|
+
If there is trouble finding the correct port, pass the "--port" flag to the above command with the ${isWindows ? 'COM Port' : 'path to the /dev.cu.*'} that matches your device.
|
|
67
96
|
`);
|
|
68
97
|
}
|
|
69
98
|
exports.default = default_1;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwMzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9zZXR1cC9lc3AzMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUFtRDtBQUNuRCwyQkFBeUM7QUFDekMsMkNBQTREO0FBQzVELHlDQUEyQztBQUMzQyxnRUFBdUM7QUFDdkMscUNBQTJEO0FBQzNELHlDQUErRDtBQUMvRCw2Q0FBK0Q7QUFDL0QsdUNBQStEO0FBRWhELEtBQUs7SUFDbEIsTUFBTSxFQUFFLEdBQUcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUN2QyxNQUFNLFNBQVMsR0FBRyxFQUFFLEtBQUssWUFBWSxDQUFBO0lBQ3JDLE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFBO0lBQy9ELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQTtJQUMzQixNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzFELE1BQU0sUUFBUSxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUV6RCxNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO0lBRXZDLDRCQUE0QjtJQUM1QixJQUFJLENBQUMsSUFBQSx5QkFBYyxHQUFFLEVBQUU7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FDVixvRUFBb0UsQ0FDckUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCxJQUFJLFNBQVM7UUFBRSxNQUFNLElBQUEscUNBQTJCLEVBQUMsT0FBTyxDQUFDLENBQUE7SUFFekQsMkNBQTJDO0lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUNoRCxvQkFB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
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.installDeps = exports.installPython = void 0;
|
|
7
|
+
const gluegun_1 = require("gluegun");
|
|
8
|
+
const stream_1 = require("stream");
|
|
9
|
+
const axios_1 = __importDefault(require("axios"));
|
|
10
|
+
const unzip_stream_1 = require("unzip-stream");
|
|
11
|
+
const util_1 = require("util");
|
|
12
|
+
const windows_1 = require("../windows");
|
|
13
|
+
const constants_1 = require("../constants");
|
|
14
|
+
const finishedPromise = (0, util_1.promisify)(stream_1.finished);
|
|
15
|
+
const ESP_TOOL = 'https://github.com/igrr/esptool-ck/releases/download/0.4.13/esptool-0.4.13-win32.zip';
|
|
16
|
+
const ESP_TOOL_VERSION = 'esptool-0.4.13-win32';
|
|
17
|
+
const CYGWIN = 'https://www.dropbox.com/s/ub7xehxbf747eu1/cygwin.win32.zip?dl=1';
|
|
18
|
+
async function installPython(spinner) {
|
|
19
|
+
if (gluegun_1.system.which('python') === null) {
|
|
20
|
+
// For some reason, system.which does not work with winget. This is a workaround for now.
|
|
21
|
+
try {
|
|
22
|
+
await gluegun_1.system.exec('where winget');
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
gluegun_1.print.error('Python is required.');
|
|
26
|
+
gluegun_1.print.info('You can download and install Python from python.org/downloads');
|
|
27
|
+
gluegun_1.print.info('Or xs-dev can manage installing Python and other dependencies using the Windows Package Manager Client (winget).');
|
|
28
|
+
gluegun_1.print.info('You can install winget via the App Installer package in the Microsoft Store.');
|
|
29
|
+
gluegun_1.print.info('Please install either Python or winget, then launch a new Command Prompt and re-run this setup.');
|
|
30
|
+
throw new Error('Python is required');
|
|
31
|
+
}
|
|
32
|
+
spinner.start('Installing python from winget');
|
|
33
|
+
await gluegun_1.system.exec('winget install -e --id Python.Python.3 --silent');
|
|
34
|
+
spinner.succeed();
|
|
35
|
+
gluegun_1.print.info('Python successfully installed. Please close this window and launch a new Moddable Command Prompt to refresh environment variables, then re-run this setup.');
|
|
36
|
+
throw new Error('Command Prompt restart needed');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.installPython = installPython;
|
|
40
|
+
async function installDeps(spinner, ESP_DIR) {
|
|
41
|
+
const ESP_TOOL_DIR = gluegun_1.filesystem.resolve(ESP_DIR, ESP_TOOL_VERSION);
|
|
42
|
+
const ESP_TOOL_EXE = gluegun_1.filesystem.resolve(ESP_TOOL_DIR, 'esptool.exe');
|
|
43
|
+
const ESP_TOOL_DESTINATION = gluegun_1.filesystem.resolve(ESP_DIR, 'esptool.exe');
|
|
44
|
+
const CYGWIN_BIN = gluegun_1.filesystem.resolve(ESP_DIR, 'cygwin', 'bin');
|
|
45
|
+
spinner.start('Downloading ESP Tool');
|
|
46
|
+
let writer = (0, unzip_stream_1.Extract)({ path: ESP_DIR });
|
|
47
|
+
let response = await axios_1.default.get(ESP_TOOL, {
|
|
48
|
+
responseType: 'stream',
|
|
49
|
+
});
|
|
50
|
+
response.data.pipe(writer);
|
|
51
|
+
await finishedPromise(writer);
|
|
52
|
+
gluegun_1.filesystem.move(ESP_TOOL_EXE, ESP_TOOL_DESTINATION, { overwrite: true });
|
|
53
|
+
gluegun_1.filesystem.remove(ESP_TOOL_DIR);
|
|
54
|
+
spinner.succeed();
|
|
55
|
+
spinner.start('Downloading Cygwin toolchain support package');
|
|
56
|
+
writer = (0, unzip_stream_1.Extract)({ path: ESP_DIR });
|
|
57
|
+
response = await axios_1.default.get(CYGWIN, {
|
|
58
|
+
responseType: 'stream',
|
|
59
|
+
});
|
|
60
|
+
response.data.pipe(writer);
|
|
61
|
+
await finishedPromise(writer);
|
|
62
|
+
spinner.succeed();
|
|
63
|
+
spinner.start('Setting environment variables');
|
|
64
|
+
await (0, windows_1.setEnv)('BASE_DIR', constants_1.INSTALL_DIR);
|
|
65
|
+
await (0, windows_1.addToPath)(CYGWIN_BIN);
|
|
66
|
+
spinner.succeed();
|
|
67
|
+
try {
|
|
68
|
+
await installPython(spinner);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// Command Prompt restart needed
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
if (gluegun_1.system.which('pip') === null) {
|
|
75
|
+
spinner.start('Installing pip through ensurepip');
|
|
76
|
+
await gluegun_1.system.exec('python -m ensurepip');
|
|
77
|
+
spinner.succeed();
|
|
78
|
+
}
|
|
79
|
+
spinner.start('Installing pyserial through pip');
|
|
80
|
+
await gluegun_1.system.exec('python -m pip install pyserial');
|
|
81
|
+
spinner.succeed();
|
|
82
|
+
}
|
|
83
|
+
exports.installDeps = installDeps;
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDgyNjYvd2luZG93cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsbUNBQWlDO0FBQ2pDLGtEQUF5QjtBQUV6QiwrQ0FBb0Q7QUFDcEQsK0JBQWdDO0FBQ2hDLHdDQUE4QztBQUM5Qyw0Q0FBMEM7QUFFMUMsTUFBTSxlQUFlLEdBQUcsSUFBQSxnQkFBUyxFQUFDLGlCQUFRLENBQUMsQ0FBQTtBQUUzQyxNQUFNLFFBQVEsR0FDWixzRkFBc0YsQ0FBQTtBQUN4RixNQUFNLGdCQUFnQixHQUFHLHNCQUFzQixDQUFBO0FBQy9DLE1BQU0sTUFBTSxHQUFHLGlFQUFpRSxDQUFBO0FBRXpFLEtBQUssVUFBVSxhQUFhLENBQ2pDLE9BQXlDO0lBRXpDLElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ25DLHlGQUF5RjtRQUN6RixJQUFJO1lBQ0YsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtTQUNsQztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsZUFBSyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1lBQ2xDLGVBQUssQ0FBQyxJQUFJLENBQ1IsK0RBQStELENBQ2hFLENBQUE7WUFDRCxlQUFLLENBQUMsSUFBSSxDQUNSLGtIQUFrSCxDQUNuSCxDQUFBO1lBQ0QsZUFBSyxDQUFDLElBQUksQ0FDUiw4RUFBOEUsQ0FDL0UsQ0FBQTtZQUNELGVBQUssQ0FBQyxJQUFJLENBQ1IsaUdBQWlHLENBQ2xHLENBQUE7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7U0FDdEM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDOUMsTUFBTSxnQkFBTSxDQUFDLElB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
|
|
@@ -16,10 +16,15 @@ const moddable_1 = require("./moddable");
|
|
|
16
16
|
const upsert_1 = __importDefault(require("../patching/upsert"));
|
|
17
17
|
const mac_1 = require("./esp8266/mac");
|
|
18
18
|
const linux_1 = require("./esp8266/linux");
|
|
19
|
+
const windows_1 = require("./esp8266/windows");
|
|
20
|
+
const windows_2 = require("./windows");
|
|
19
21
|
const finishedPromise = (0, util_1.promisify)(stream_1.finished);
|
|
20
22
|
async function default_1() {
|
|
21
23
|
const OS = (0, os_1.type)().toLowerCase();
|
|
22
|
-
const
|
|
24
|
+
const isWindows = OS === 'windows_nt';
|
|
25
|
+
const TOOLCHAIN = isWindows
|
|
26
|
+
? 'https://www.dropbox.com/s/edbtq6oi1up623i/esp8266.toolchain.win32.zip?dl=1'
|
|
27
|
+
: `https://www.moddable.com/private/esp8266.toolchain.${OS}.tgz`;
|
|
23
28
|
const ARDUINO_CORE = 'https://github.com/esp8266/Arduino/releases/download/2.3.0/esp8266-2.3.0.zip';
|
|
24
29
|
const ESP_RTOS_REPO = 'https://github.com/espressif/ESP8266_RTOS_SDK.git';
|
|
25
30
|
const ESP_BRANCH = 'release/v3.2';
|
|
@@ -34,19 +39,31 @@ async function default_1() {
|
|
|
34
39
|
spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
|
|
35
40
|
process.exit(1);
|
|
36
41
|
}
|
|
42
|
+
if (isWindows)
|
|
43
|
+
await (0, windows_2.ensureModdableCommandPrompt)(spinner);
|
|
37
44
|
// 1. ensure ~/.local/share/esp directory
|
|
38
45
|
spinner.info('Ensuring esp directory');
|
|
39
46
|
gluegun_1.filesystem.dir(ESP_DIR);
|
|
40
47
|
// 2. download and untar xtensa toolchain
|
|
41
48
|
if (gluegun_1.filesystem.exists(TOOLCHAIN_PATH) === false) {
|
|
42
49
|
spinner.start('Downloading xtensa toolchain');
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
if (isWindows) {
|
|
51
|
+
const writer = (0, unzip_stream_1.Extract)({ path: ESP_DIR });
|
|
52
|
+
const response = await axios_1.default.get(TOOLCHAIN, {
|
|
53
|
+
responseType: 'stream',
|
|
54
|
+
});
|
|
55
|
+
response.data.pipe(writer);
|
|
56
|
+
await finishedPromise(writer);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const writer = (0, tar_fs_1.extract)(ESP_DIR, { readable: true });
|
|
60
|
+
const gunzip = (0, zlib_1.createGunzip)();
|
|
61
|
+
const response = await axios_1.default.get(TOOLCHAIN, {
|
|
62
|
+
responseType: 'stream',
|
|
63
|
+
});
|
|
64
|
+
response.data.pipe(gunzip).pipe(writer);
|
|
65
|
+
await finishedPromise(writer);
|
|
66
|
+
}
|
|
50
67
|
spinner.succeed();
|
|
51
68
|
}
|
|
52
69
|
// 3. download and unzip esp8266 core for arduino
|
|
@@ -73,17 +90,28 @@ async function default_1() {
|
|
|
73
90
|
if (OS === 'linux') {
|
|
74
91
|
await (0, linux_1.installDeps)(spinner);
|
|
75
92
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
93
|
+
if (isWindows) {
|
|
94
|
+
try {
|
|
95
|
+
await (0, windows_1.installDeps)(spinner, ESP_DIR);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
gluegun_1.print.error(`Windows dependencies failed to install. Please review the information above.`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
81
101
|
}
|
|
102
|
+
// 7. create ESP_BASE env export in shell profile
|
|
103
|
+
if (OS === 'darwin' || OS === 'linux') {
|
|
104
|
+
if (process.env.ESP_BASE === undefined) {
|
|
105
|
+
spinner.info('Configuring $ESP_BASE');
|
|
106
|
+
process.env.ESP_BASE = ESP_DIR;
|
|
107
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `export ESP_BASE=${process.env.ESP_BASE}`);
|
|
108
|
+
}
|
|
109
|
+
} // Windows case is handled in ./esp8266/windows.ts
|
|
82
110
|
spinner.succeed(`
|
|
83
|
-
Successfully set up esp8266 platform support for
|
|
84
|
-
Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device esp8266
|
|
111
|
+
Successfully set up esp8266 platform support for Moddable!
|
|
112
|
+
Test out the setup by starting a new ${isWindows ? 'Moddable Command Prompt' : 'terminal session'}, plugging in your device, and running: xs-dev run --example helloworld --device esp8266
|
|
85
113
|
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.
|
|
86
114
|
`);
|
|
87
115
|
}
|
|
88
116
|
exports.default = default_1;
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNwODI2Ni5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL2VzcDgyNjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQXlCO0FBQ3pCLG1DQUFpQztBQUNqQywrQkFBZ0M7QUFDaEMsbUNBQWdDO0FBQ2hDLCtCQUFtQztBQUNuQywrQ0FBb0Q7QUFDcEQsMkJBQXlDO0FBQ3pDLDJDQUE0RDtBQUM1RCx5Q0FBMkM7QUFDM0MsZ0VBQXVDO0FBQ3ZDLHVDQUE2RDtBQUM3RCwyQ0FBaUU7QUFDakUsK0NBQXFFO0FBQ3JFLHVDQUF1RDtBQUV2RCxNQUFNLGVBQWUsR0FBRyxJQUFBLGdCQUFTLEVBQUMsaUJBQVEsQ0FBQyxDQUFBO0FBRTVCLEtBQUs7SUFDbEIsTUFBTSxFQUFFLEdBQUcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUN2QyxNQUFNLFNBQVMsR0FBRyxFQUFFLEtBQUssWUFBWSxDQUFBO0lBQ3JDLE1BQU0sU0FBUyxHQUFHLFNBQVM7UUFDekIsQ0FBQyxDQUFDLDRFQUE0RTtRQUM5RSxDQUFDLENBQUMsc0RBQXNELEVBQUUsTUFBTSxDQUFBO0lBQ2xFLE1BQU0sWUFBWSxHQUNoQiw4RUFBOEUsQ0FBQTtJQUNoRixNQUFNLGFBQWEsR0FBRyxtREFBbUQsQ0FBQTtJQUN6RSxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUE7SUFDakMsTUFBTSxPQUFPLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN0RCxNQUFNLFNBQVMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtJQUNqRSxNQUFNLGNBQWMsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDL0QsTUFBTSxpQkFBaUIsR0FBRyxvQkFB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
|
|
@@ -1,8 +1,172 @@
|
|
|
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 });
|
|
6
|
+
exports.ensureModdableCommandPrompt = exports.openModdableCommandPrompt = exports.addToPath = exports.setEnv = void 0;
|
|
3
7
|
const gluegun_1 = require("gluegun");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
const upsert_1 = __importDefault(require("../patching/upsert"));
|
|
10
|
+
const windows_shortcuts_1 = __importDefault(require("windows-shortcuts"));
|
|
11
|
+
const util_1 = require("util");
|
|
12
|
+
const wsPromise = (0, util_1.promisify)(windows_shortcuts_1.default.create);
|
|
13
|
+
const SHORTCUT = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'Moddable Command Prompt.lnk');
|
|
14
|
+
async function setEnv(name, permanentValue, envValue) {
|
|
15
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `set "${name}=${permanentValue}"`);
|
|
16
|
+
process.env[name] = envValue !== undefined ? envValue : permanentValue;
|
|
17
|
+
}
|
|
18
|
+
exports.setEnv = setEnv;
|
|
19
|
+
async function addToPath(path) {
|
|
20
|
+
var _a;
|
|
21
|
+
const newPath = `${path};${(_a = process.env.PATH) !== null && _a !== void 0 ? _a : ''}`;
|
|
22
|
+
await setEnv('PATH', `${path};%PATH%`, newPath);
|
|
23
|
+
}
|
|
24
|
+
exports.addToPath = addToPath;
|
|
25
|
+
async function openModdableCommandPrompt() {
|
|
26
|
+
gluegun_1.print.info('Opening the Moddable Command Prompt in a new Window');
|
|
27
|
+
await gluegun_1.system.run(`START "Moddable Command Prompt" "${SHORTCUT}"`);
|
|
28
|
+
}
|
|
29
|
+
exports.openModdableCommandPrompt = openModdableCommandPrompt;
|
|
30
|
+
async function ensureModdableCommandPrompt(spinner) {
|
|
31
|
+
if (process.env.ISMODDABLECOMMANDPROMPT === undefined ||
|
|
32
|
+
process.env.ISMODDABLECOMMANDPROMPT === '') {
|
|
33
|
+
if (gluegun_1.filesystem.exists(SHORTCUT) !== false) {
|
|
34
|
+
spinner.fail(`Moddable tooling required. Run xs-dev commands from the Moddable Command Prompt: ${SHORTCUT}`);
|
|
35
|
+
await openModdableCommandPrompt();
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
|
|
39
|
+
}
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ensureModdableCommandPrompt = ensureModdableCommandPrompt;
|
|
4
44
|
async function default_1(_args) {
|
|
5
|
-
gluegun_1.
|
|
45
|
+
const BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'win', 'release');
|
|
46
|
+
const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'win');
|
|
47
|
+
gluegun_1.print.info(`Setting up Windows tools at ${constants_1.INSTALL_PATH}`);
|
|
48
|
+
// 0. Check for Visual Studio CMD tools & Git
|
|
49
|
+
if (gluegun_1.system.which('nmake') === null ||
|
|
50
|
+
process.env.VSINSTALLDIR === undefined) {
|
|
51
|
+
try {
|
|
52
|
+
await gluegun_1.system.exec('where winget');
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
gluegun_1.print.error('Visual Studio 2022 Community is required to build the Moddable SDK');
|
|
56
|
+
gluegun_1.print.error('If you already have VS 2022 Community installed, please run "xs-dev setup" from the x86 Native Tools Command Prompt for VS 2022');
|
|
57
|
+
gluegun_1.print.error('You can download and install Visual Studio 2022 Community from https://www.visualstudio.com/downloads/');
|
|
58
|
+
gluegun_1.print.info('Or xs-dev can manage installing Visual Stuudio 2022 Community and other dependencies using the Windows Package Manager Client (winget).');
|
|
59
|
+
gluegun_1.print.info('You can install winget via the App Installer package in the Microsoft Store.');
|
|
60
|
+
gluegun_1.print.info('Please install either Visual Studio 2022 Community or winget, then launch a new xs86 Native Tools Command Prompt for VS 2022 and re-run this setup.');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
gluegun_1.print.info('Installing Visual Studio 2022 Community from winget...');
|
|
64
|
+
try {
|
|
65
|
+
await gluegun_1.system.exec('winget install -e --id Microsoft.VisualStudio.2022.Community --silent', { stdio: 'inherit', shell: true });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
gluegun_1.print.error('Visual Studio 2022 Community install failed');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
gluegun_1.print.info('Visual Studio 2022 Community successfully installed.');
|
|
72
|
+
gluegun_1.print.info('The "Desktop development for C++" workload must be manually installed.');
|
|
73
|
+
gluegun_1.print.info('From your Start Menu, select Visual Studio Installer. Then "Modify." Then select "Desktop development with C++" Then "Modify" again.');
|
|
74
|
+
gluegun_1.print.info('When complete, please close this window and launch the "x86 Native Tools Command Prompt for VS 2022" from the start menu.');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
if (gluegun_1.system.which('git') === null) {
|
|
78
|
+
try {
|
|
79
|
+
await gluegun_1.system.exec('where winget');
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
gluegun_1.print.error('git is required to clone the Moddable SDK');
|
|
83
|
+
gluegun_1.print.error('You can download and install git from https://git-scm.com/download/win');
|
|
84
|
+
gluegun_1.print.info('Or xs-dev can manage installing git and other dependencies using the Windows Package Manager Client (winget).');
|
|
85
|
+
gluegun_1.print.info('You can install winget via the App Installer package in the Microsoft Store.');
|
|
86
|
+
gluegun_1.print.info('Please install either git or winget, then launch a new xs86 Native Tools Command Prompt for VS 2022 and re-run this setup.');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
gluegun_1.print.info('Installing git from winget...');
|
|
90
|
+
try {
|
|
91
|
+
await gluegun_1.system.exec('winget install -e --id Git.Git --silent', {
|
|
92
|
+
stdio: 'inherit',
|
|
93
|
+
shell: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
gluegun_1.print.error('git install failed');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
gluegun_1.print.info('git successfully installed. Please close this window and re-launch the x86 Native Tools Command Prompt for VS 2022, then re-run this setup.');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
const spinner = gluegun_1.print.spin();
|
|
104
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, '@echo off');
|
|
105
|
+
const vsBatPath = gluegun_1.filesystem.resolve(process.env.VSINSTALLDIR, 'VC', 'Auxiliary', 'Build', 'vcvars32.bat');
|
|
106
|
+
await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `call "${vsBatPath}"`);
|
|
107
|
+
// 1. clone moddable repo into INSTALL_DIR directory if it does not exist yet
|
|
108
|
+
try {
|
|
109
|
+
gluegun_1.filesystem.dir(constants_1.INSTALL_DIR);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
spinner.fail(`Error setting up install directory: ${String(error)}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
if (gluegun_1.filesystem.exists(constants_1.INSTALL_PATH) !== false) {
|
|
116
|
+
spinner.info('Moddable repo already installed');
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
try {
|
|
120
|
+
spinner.start('Cloning Moddable-OpenSource/moddable repo');
|
|
121
|
+
await gluegun_1.system.spawn(`git clone ${constants_1.MODDABLE_REPO} ${constants_1.INSTALL_PATH}`);
|
|
122
|
+
spinner.succeed();
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
spinner.fail(`Error cloning moddable repo: ${String(error)}`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// 2. configure MODDABLE env variable, add release binaries dir to PATH
|
|
130
|
+
spinner.start(`Creating Moddable SDK Environment Batch File`);
|
|
131
|
+
try {
|
|
132
|
+
await setEnv('MODDABLE', constants_1.INSTALL_PATH);
|
|
133
|
+
await addToPath(BIN_PATH);
|
|
134
|
+
await setEnv('ISMODDABLECOMMANDPROMPT', '1');
|
|
135
|
+
spinner.succeed();
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
spinner.fail(error.toString());
|
|
139
|
+
}
|
|
140
|
+
// 3. build tools
|
|
141
|
+
try {
|
|
142
|
+
spinner.start(`Building Moddable SDK tools`);
|
|
143
|
+
await gluegun_1.system.exec(`build.bat`, { cwd: BUILD_DIR, stdout: process.stdout });
|
|
144
|
+
spinner.succeed();
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
spinner.fail(`Error building Moddable SDK tools: ${String(error)}`);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
// 4. create Windows shortcut
|
|
151
|
+
try {
|
|
152
|
+
spinner.start(`Creating Moddable Command Prompt Shortcut`);
|
|
153
|
+
await wsPromise(SHORTCUT, {
|
|
154
|
+
target: '^%comspec^%',
|
|
155
|
+
args: `/k ${constants_1.EXPORTS_FILE_PATH}`,
|
|
156
|
+
workingDir: `${constants_1.INSTALL_PATH}`,
|
|
157
|
+
desc: 'Moddable Command Prompt',
|
|
158
|
+
});
|
|
159
|
+
spinner.succeed();
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
spinner.fail('Error creating Moddable Command Prompt shortcut');
|
|
163
|
+
}
|
|
164
|
+
spinner.succeed('Moddable SDK successfully set up!');
|
|
165
|
+
gluegun_1.print.info(`A shortcut to the Moddable Command Prompt has been created at ${SHORTCUT}.`);
|
|
166
|
+
gluegun_1.print.info('You should always use the Moddable Command Prompt when working with the Moddable SDK.');
|
|
167
|
+
gluegun_1.print.info(`The Moddable Command Prompt will now open for you in a new Window. Please close this Command Prompt and use the Moddable Command Prompt instead.`);
|
|
168
|
+
gluegun_1.print.info(`As a next step, try running the "helloworld example" in the Moddable Command Prompt: xs-dev run --example helloworld'`);
|
|
169
|
+
await openModdableCommandPrompt();
|
|
6
170
|
}
|
|
7
171
|
exports.default = default_1;
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dpbmRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUNBQWlFO0FBQ2pFLDJDQUtvQjtBQUNwQixnRUFBdUM7QUFDdkMsMEVBQWtDO0FBQ2xDLCtCQUFnQztBQUdoQyxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFTLEVBQUMsMkJBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUV0QyxNQUFNLFFBQVEsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLDZCQUE2QixDQUFDLENBQUE7QUFFeEUsS0FBSyxVQUFVLE1BQU0sQ0FDMUIsSUFBWSxFQUNaLGNBQXNCLEVBQ3RCLFFBQWlCO0lBRWpCLE1BQU0sSUFBQSxnQkFBTSxFQUFDLDZCQUFpQixFQUFFLFFBQVEsSUFBSSxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUE7SUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQTtBQUN4RSxDQUFDO0FBUEQsd0JBT0M7QUFFTSxLQUFLLFVBQVUsU0FBUyxDQUFDLElBQVk7O0lBQzFDLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxJQUFJLE1BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEVBQUUsRUFBRSxDQUFBO0lBQ25ELE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFIRCw4QkFHQztBQUVNLEtBQUssVUFBVSx5QkFBeUI7SUFDN0MsZUFBSyxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLFFBQVEsR0FBRyxD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
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
import { GluegunPrint } from 'gluegun';
|
|
1
2
|
import { SetupArgs } from './types';
|
|
3
|
+
export declare function setEnv(name: string, permanentValue: string, envValue?: string): Promise<void>;
|
|
4
|
+
export declare function addToPath(path: string): Promise<void>;
|
|
5
|
+
export declare function openModdableCommandPrompt(): Promise<void>;
|
|
6
|
+
export declare function ensureModdableCommandPrompt(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
|
|
2
7
|
export default function (_args: SetupArgs): Promise<void>;
|
|
@@ -7,10 +7,10 @@ import '../styles/index.css';
|
|
|
7
7
|
<meta charset="utf-8" />
|
|
8
8
|
<meta name="viewport" content="width=device-width" />
|
|
9
9
|
|
|
10
|
-
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
11
|
-
<link rel="alternate icon" type="image/x-icon" href="/favicon.ico" />
|
|
10
|
+
<link rel="icon" type="image/svg+xml" href="/xs-dev/favicon.svg" />
|
|
11
|
+
<link rel="alternate icon" type="image/x-icon" href="/xs-dev/favicon.ico" />
|
|
12
12
|
|
|
13
|
-
<link rel="sitemap" href="/sitemap.xml" />
|
|
13
|
+
<link rel="sitemap" href="/xs-dev/sitemap.xml" />
|
|
14
14
|
|
|
15
15
|
<!-- Preload Fonts -->
|
|
16
16
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
@@ -18,7 +18,7 @@ import '../styles/index.css';
|
|
|
18
18
|
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital@0;1&display=swap" rel="stylesheet" />
|
|
19
19
|
|
|
20
20
|
<!-- Scrollable a11y code helper -->
|
|
21
|
-
<script src="/make-scrollable-code-focusable.js" is:inline></script>
|
|
21
|
+
<script src="/xs-dev/make-scrollable-code-focusable.js" is:inline></script>
|
|
22
22
|
|
|
23
23
|
<!-- This is intentionally inlined to avoid FOUC -->
|
|
24
24
|
<script is:inline>
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
import TableOfContents from './TableOfContents.tsx';
|
|
3
3
|
import MoreMenu from './MoreMenu.astro';
|
|
4
|
-
const { content, githubEditUrl } = Astro.props;
|
|
5
|
-
const headers = content.astro.headers;
|
|
4
|
+
const { content, githubEditUrl, headings } = Astro.props;
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
<nav class="sidebar-nav" aria-labelledby="grid-right">
|
|
9
8
|
<div class="sidebar-nav-inner">
|
|
10
|
-
<TableOfContents client:media="(min-width: 50em)" {
|
|
9
|
+
<TableOfContents client:media="(min-width: 50em)" {headings} />
|
|
11
10
|
<MoreMenu editHref={githubEditUrl} />
|
|
12
11
|
</div>
|
|
13
12
|
</nav>
|
|
@@ -1,49 +1,56 @@
|
|
|
1
|
-
import type { FunctionalComponent } from 'preact'
|
|
2
|
-
import { h, Fragment } from 'preact'
|
|
3
|
-
import { useState, useEffect, useRef } from 'preact/hooks'
|
|
1
|
+
import type { FunctionalComponent } from 'preact'
|
|
2
|
+
import { h, Fragment } from 'preact'
|
|
3
|
+
import { useState, useEffect, useRef } from 'preact/hooks'
|
|
4
|
+
import type { MarkdownHeading } from 'astro'
|
|
4
5
|
|
|
5
|
-
const TableOfContents: FunctionalComponent<{
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const TableOfContents: FunctionalComponent<{ headings: MarkdownHeading[] }> = ({
|
|
7
|
+
headings = [],
|
|
8
|
+
}) => {
|
|
9
|
+
const itemOffsets = useRef([])
|
|
10
|
+
const [activeId] = useState<string>(undefined)
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const getItemOffsets = () => {
|
|
14
|
+
const titles = document.querySelectorAll('article :is(h1, h2, h3, h4)')
|
|
15
|
+
itemOffsets.current = Array.from(titles).map((title) => ({
|
|
16
|
+
id: title.id,
|
|
17
|
+
topOffset: title.getBoundingClientRect().top + window.scrollY,
|
|
18
|
+
}))
|
|
19
|
+
}
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
getItemOffsets()
|
|
22
|
+
window.addEventListener('resize', getItemOffsets)
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
return () => {
|
|
25
|
+
window.removeEventListener('resize', getItemOffsets)
|
|
26
|
+
}
|
|
27
|
+
}, [])
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
29
|
+
return (
|
|
30
|
+
<>
|
|
31
|
+
<h2 class="heading">On this page</h2>
|
|
32
|
+
<ul>
|
|
33
|
+
<li
|
|
34
|
+
class={`header-link depth-2 ${
|
|
35
|
+
activeId === 'overview' ? 'active' : ''
|
|
36
|
+
}`.trim()}
|
|
37
|
+
>
|
|
38
|
+
<a href="#overview">Overview</a>
|
|
39
|
+
</li>
|
|
40
|
+
{headings
|
|
41
|
+
.filter(({ depth }) => depth > 1 && depth < 4)
|
|
42
|
+
.map((header) => (
|
|
43
|
+
<li
|
|
44
|
+
class={`header-link depth-${header.depth} ${
|
|
45
|
+
activeId === header.slug ? 'active' : ''
|
|
46
|
+
}`.trim()}
|
|
47
|
+
>
|
|
48
|
+
<a href={`#${header.slug}`}>{header.text}</a>
|
|
49
|
+
</li>
|
|
50
|
+
))}
|
|
51
|
+
</ul>
|
|
52
|
+
</>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
48
55
|
|
|
49
|
-
export default TableOfContents
|
|
56
|
+
export default TableOfContents
|
|
@@ -8,7 +8,7 @@ import LeftSidebar from '../components/LeftSidebar/LeftSidebar.astro';
|
|
|
8
8
|
import RightSidebar from '../components/RightSidebar/RightSidebar.astro';
|
|
9
9
|
import * as CONFIG from '../config';
|
|
10
10
|
|
|
11
|
-
const { content = {} } = Astro.props;
|
|
11
|
+
const { content = {}, headings = [] } = Astro.props;
|
|
12
12
|
const currentPage = new URL(Astro.request.url).pathname;
|
|
13
13
|
const currentFile = `src/pages${currentPage.replace(/\/$/, '')}.md`;
|
|
14
14
|
const githubEditUrl = CONFIG.GITHUB_EDIT_URL && CONFIG.GITHUB_EDIT_URL + currentFile;
|
|
@@ -115,7 +115,7 @@ const githubEditUrl = CONFIG.GITHUB_EDIT_URL && CONFIG.GITHUB_EDIT_URL + current
|
|
|
115
115
|
</PageContent>
|
|
116
116
|
</div>
|
|
117
117
|
<aside id="grid-right" class="grid-sidebar" title="Table of Contents">
|
|
118
|
-
<RightSidebar {content} {githubEditUrl} />
|
|
118
|
+
<RightSidebar {content} {headings} {githubEditUrl} />
|
|
119
119
|
</aside>
|
|
120
120
|
</main>
|
|
121
121
|
</body>
|
|
@@ -48,3 +48,7 @@ Node comes with [npm](https://docs.npmjs.com/cli/v8/commands/npm) as the include
|
|
|
48
48
|
|
|
49
49
|
- [pnpm](https://pnpm.io/installation)
|
|
50
50
|
- [yarn](https://yarnpkg.com/)
|
|
51
|
+
|
|
52
|
+
## Linux Permissions
|
|
53
|
+
|
|
54
|
+
Setup commands rely on [`ssh-askpass`](https://packages.ubuntu.com/bionic/ssh-askpass) to prompt for permission when installing other tools and dependencies.
|
|
@@ -52,7 +52,7 @@ xs-dev run --example helloworld
|
|
|
52
52
|
|
|
53
53
|
This will start up the debugger and simulator:
|
|
54
54
|
|
|
55
|
-

|
|
55
|
+

|
|
56
56
|
|
|
57
57
|
This will keep running until the `Ctrl+C` keys are entered in the terminal session or both apps are quit.
|
|
58
58
|
|
package/docs/tsconfig.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xs-dev",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.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": {
|
|
@@ -27,10 +27,12 @@
|
|
|
27
27
|
"serve-handler": "^6.1.3",
|
|
28
28
|
"tar-fs": "^2.1.1",
|
|
29
29
|
"unzip-stream": "^0.3.1",
|
|
30
|
-
"usb": "^2.2.0"
|
|
30
|
+
"usb": "^2.2.0",
|
|
31
|
+
"windows-shortcuts": "^0.1.6"
|
|
31
32
|
},
|
|
32
33
|
"devDependencies": {
|
|
33
34
|
"@astrojs/lit": "^1.0.0",
|
|
35
|
+
"@astrojs/mdx": "^0.10.1",
|
|
34
36
|
"@astrojs/preact": "^1.0.1",
|
|
35
37
|
"@astrojs/sitemap": "^1.0.0",
|
|
36
38
|
"@astrojs/tailwind": "^1.0.0",
|
|
@@ -43,7 +45,7 @@
|
|
|
43
45
|
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
|
44
46
|
"@typescript-eslint/parser": "^4.0.0",
|
|
45
47
|
"@webcomponents/template-shadowroot": "^0.1.0",
|
|
46
|
-
"astro": "^1.0.
|
|
48
|
+
"astro": "^1.0.8",
|
|
47
49
|
"eslint": "^7.12.1",
|
|
48
50
|
"eslint-config-prettier": "^8.3.0",
|
|
49
51
|
"eslint-config-standard-with-typescript": "^21.0.1",
|
|
@@ -56,6 +58,7 @@
|
|
|
56
58
|
"preact": "^10.7.3",
|
|
57
59
|
"preact-render-to-string": "^5.2.0",
|
|
58
60
|
"prettier": "^2.5.1",
|
|
61
|
+
"rollup": "^2.78.1",
|
|
59
62
|
"ts-jest": "^27.1.0",
|
|
60
63
|
"ts-node": "^10.9.1",
|
|
61
64
|
"typescript": "^4.7.3"
|