xs-dev 0.15.1 → 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/bin/xs-dev +3 -4
- package/build/commands/build.js +30 -0
- package/build/commands/run.js +15 -124
- package/build/commands/setup.js +3 -3
- package/build/commands/update.js +3 -3
- package/build/extensions/build-extension.js +7 -0
- package/build/toolbox/build/index.js +145 -0
- 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/linux.js +45 -7
- package/build/toolbox/setup/mac.js +51 -12
- package/build/toolbox/setup/moddable.js +35 -2
- package/build/toolbox/setup/types.js +3 -0
- package/build/toolbox/setup/windows.js +167 -3
- package/build/toolbox/update/linux.js +92 -31
- package/build/toolbox/update/mac.js +80 -26
- package/build/types/commands/build.d.ts +4 -0
- package/build/types/extensions/build-extension.d.ts +3 -0
- package/build/types/toolbox/build/index.d.ts +13 -0
- 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/linux.d.ts +2 -1
- package/build/types/toolbox/setup/mac.d.ts +2 -1
- package/build/types/toolbox/setup/moddable.d.ts +11 -0
- package/build/types/toolbox/setup/types.d.ts +3 -0
- package/build/types/toolbox/setup/windows.d.ts +7 -1
- package/build/types/toolbox/update/linux.d.ts +2 -1
- package/build/types/toolbox/update/mac.d.ts +2 -1
- package/build/types/types.d.ts +5 -2
- package/docs/public/run-hello-world.png +0 -0
- package/docs/src/components/HeadCommon.astro +4 -13
- package/docs/src/components/HeadSEO.astro +2 -8
- package/docs/src/components/Header/Header.astro +1 -1
- package/docs/src/components/LeftSidebar/LeftSidebar.astro +1 -1
- package/docs/src/components/RightSidebar/RightSidebar.astro +2 -3
- package/docs/src/components/RightSidebar/TableOfContents.tsx +50 -43
- package/docs/src/config.ts +3 -0
- package/docs/src/layouts/MainLayout.astro +3 -3
- package/docs/src/pages/en/features/run.md +29 -2
- package/docs/src/pages/en/features/setup.md +13 -1
- package/docs/src/pages/en/features/update.md +16 -0
- package/docs/src/pages/en/guide/00-prepare.md +54 -0
- package/docs/src/pages/en/guide/01-hello-console.md +62 -0
- package/docs/tsconfig.json +3 -1
- package/package.json +12 -9
package/README.md
CHANGED
package/bin/xs-dev
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
/* tslint:disable */
|
|
5
4
|
// check if we're running in dev mode
|
|
6
5
|
var devMode = require('fs').existsSync(`${__dirname}/../src`)
|
|
@@ -13,9 +12,9 @@ if (wantsCompiled || !devMode) {
|
|
|
13
12
|
} else {
|
|
14
13
|
// this runs from the typescript source (for dev only)
|
|
15
14
|
// hook into ts-node so we can run typescript on the fly
|
|
16
|
-
require('ts-node').register({
|
|
15
|
+
require('ts-node').register({
|
|
16
|
+
project: `${__dirname}/../tsconfig.json`,
|
|
17
|
+
})
|
|
17
18
|
// run the CLI with the current process arguments
|
|
18
19
|
require(`${__dirname}/../src/cli`).run(process.argv)
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const os_1 = require("os");
|
|
4
|
+
const devices_1 = require("../toolbox/prompt/devices");
|
|
5
|
+
const command = {
|
|
6
|
+
name: 'build',
|
|
7
|
+
description: 'Build project for release to target device',
|
|
8
|
+
run: async ({ parameters, filesystem, build }) => {
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
11
|
+
const { device = currentPlatform, port, example, listExamples = false, listDevices = false, mode = (_a = process.env.NODE_ENV) !== null && _a !== void 0 ? _a : 'development', output = '', deploy = false, } = parameters.options;
|
|
12
|
+
const targetPlatform = (_b = devices_1.DEVICE_ALIAS[device]) !== null && _b !== void 0 ? _b : device;
|
|
13
|
+
const projectPath = filesystem.resolve((_c = parameters.first) !== null && _c !== void 0 ? _c : '.');
|
|
14
|
+
await build({
|
|
15
|
+
port,
|
|
16
|
+
listExamples,
|
|
17
|
+
listDevices,
|
|
18
|
+
example,
|
|
19
|
+
targetPlatform,
|
|
20
|
+
projectPath,
|
|
21
|
+
mode,
|
|
22
|
+
deployStatus: deploy ? 'push' : 'none',
|
|
23
|
+
outputDir: output !== ''
|
|
24
|
+
? filesystem.resolve(output)
|
|
25
|
+
: filesystem.resolve(String(process.env.MODDABLE), 'build'),
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
exports.default = command;
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwyQkFBeUM7QUFFekMsdURBQXdEO0FBZXhELE1BQU0sT0FBTyxHQUFpQztJQUM1QyxJQUFJLEVBQUUsT0FBTztJQUNiLFdBQVcsRUFBRSw0Q0FBNEM7SUFDekQsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTs7UUFDL0MsTUFBTSxlQUFlLEdBQVcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQVksQ0FBQTtRQUN0RSxNQUFNLEVBQ0osTUFBTSxHQUFHLGVBQWUsRUFDeEIsSUFBSSxFQUNKLE9BQU8sRUFDUCxZQUFZLEdBQUcsS0FBSyxFQUNwQixXQUFXLEdBQUcsS0FBSyxFQUNuQixJQUFJLEdBQUcsTUFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQWlCLG1DQUFJLGFBQWEsRUFDdEQsTUFBTSxHQUFHLEVBQUUsRUFDWCxNQUFNLEdBQUcsS0FBSyxHQUNmLEdBQWlCLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDcEMsTUFBTSxjQUFjLEdBQVcsTUFBQSxzQkFBWSxDQUFDLE1BQU0sQ0FBQyxtQ0FBSSxNQUFNLENBQUE7UUFDN0QsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFBLFVBQVUsQ0FBQyxLQUFLLG1DQUFJLEdBQUcsQ0FBQyxDQUFBO1FBRS9ELE1BQU0sS0FBSyxDQUFDO1lBQ1YsSUFBSTtZQUNKLFlBQVk7WUFDWixXQUFXO1lBQ1gsT0FBTztZQUNQLGNBQWM7WUFDZCxXQUFXO1lBQ1gsSUFBSTtZQUNKLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUN0QyxTQUFTLEVBQ1AsTUFBTSxLQUFLLEVBQUU7Z0JBQ1gsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUM1QixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUM7U0FDaEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFFRCxrQkFBZSxPQUFPLENBQUEifQ==
|
package/build/commands/run.js
CHANGED
|
@@ -1,137 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
const os_1 = require("os");
|
|
7
|
-
const serve_handler_1 = __importDefault(require("serve-handler"));
|
|
8
|
-
const http_1 = require("http");
|
|
9
|
-
const choices_1 = require("../toolbox/prompt/choices");
|
|
10
4
|
const devices_1 = require("../toolbox/prompt/devices");
|
|
11
5
|
const command = {
|
|
12
6
|
name: 'run',
|
|
13
7
|
description: 'Build and launch project on target device or simulator',
|
|
14
|
-
run: async ({ parameters,
|
|
8
|
+
run: async ({ parameters, filesystem, build }) => {
|
|
15
9
|
var _a, _b, _c;
|
|
16
10
|
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
17
|
-
const { device = currentPlatform, port, example, listExamples = false, listDevices = false, } = parameters.options;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
'esp32/m5stack',
|
|
31
|
-
'esp32/m5stack_core2',
|
|
32
|
-
'esp32/m5stick_fire',
|
|
33
|
-
'esp32/m5atom_echo',
|
|
34
|
-
'esp32/m5atom_lite',
|
|
35
|
-
'esp32/m5atom_matrix',
|
|
36
|
-
'esp32/m5paper',
|
|
37
|
-
'esp32/m5core_ink',
|
|
38
|
-
'esp32/heltec_wifi_kit_32',
|
|
39
|
-
'esp32/esp32_thing',
|
|
40
|
-
'esp32/esp32_thing_plus',
|
|
41
|
-
'esp32/wrover_kit',
|
|
42
|
-
'esp32/kaluga',
|
|
43
|
-
'esp32/saola_wroom',
|
|
44
|
-
'esp32/saola_wrover',
|
|
45
|
-
'wasm',
|
|
46
|
-
'pico',
|
|
47
|
-
'pico/ili9341',
|
|
48
|
-
'pico/pico_display',
|
|
49
|
-
'pico/pico_display_2',
|
|
50
|
-
'simulator/moddable_one',
|
|
51
|
-
'simulator/moddable_two',
|
|
52
|
-
'simulator/moddable_three',
|
|
53
|
-
'simulator/m5stickc',
|
|
54
|
-
'simulator/m5paper',
|
|
55
|
-
'simulator/nodemcu',
|
|
56
|
-
'simulator/pico_display',
|
|
57
|
-
'simulator/pico_display_2',
|
|
58
|
-
];
|
|
59
|
-
const { device: selectedDevice } = await prompt.ask([
|
|
60
|
-
{
|
|
61
|
-
type: 'autocomplete',
|
|
62
|
-
name: 'device',
|
|
63
|
-
message: 'Here are the available target devices:',
|
|
64
|
-
choices,
|
|
65
|
-
},
|
|
66
|
-
]);
|
|
67
|
-
if (selectedDevice !== '' && selectedDevice !== undefined) {
|
|
68
|
-
targetPlatform = selectedDevice;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
print.warning('Please select a target device to run');
|
|
72
|
-
process.exit(0);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (listExamples) {
|
|
76
|
-
const exampleProjectPath = filesystem.resolve(String(process.env.MODDABLE), 'examples');
|
|
77
|
-
const examples = (_c = filesystem.inspectTree(exampleProjectPath)) === null || _c === void 0 ? void 0 : _c.children;
|
|
78
|
-
const choices = examples !== undefined
|
|
79
|
-
? examples.map((example) => (0, choices_1.collectChoicesFromTree)(example)).flat()
|
|
80
|
-
: [];
|
|
81
|
-
const { example: selectedExample } = await prompt.ask([
|
|
82
|
-
{
|
|
83
|
-
type: 'autocomplete',
|
|
84
|
-
name: 'example',
|
|
85
|
-
message: 'Here are the available examples:',
|
|
86
|
-
choices,
|
|
87
|
-
},
|
|
88
|
-
]);
|
|
89
|
-
if (selectedExample !== '' && selectedExample !== undefined) {
|
|
90
|
-
print.info(`Running the example: xs-dev run --example ${selectedExample}`);
|
|
91
|
-
projectPath = filesystem.resolve(exampleProjectPath, selectedExample);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
print.warning('Please select an example to run.');
|
|
95
|
-
process.exit(0);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (example !== undefined) {
|
|
99
|
-
const exampleProjectPath = filesystem.resolve(String(process.env.MODDABLE), 'examples', example);
|
|
100
|
-
if (filesystem.exists(exampleProjectPath) === false) {
|
|
101
|
-
print.error('Example project does not exist.');
|
|
102
|
-
print.info(`Lookup the available examples: xs-dev run --list-examples`);
|
|
103
|
-
process.exit(1);
|
|
104
|
-
}
|
|
105
|
-
if (filesystem.exists(filesystem.resolve(exampleProjectPath, 'manifest.json')) === false) {
|
|
106
|
-
print.error('Example project must contain a manifest.json.');
|
|
107
|
-
print.info(`Lookup the available examples: xs-dev run --list-examples`);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
projectPath = exampleProjectPath;
|
|
111
|
-
}
|
|
112
|
-
if (port !== undefined) {
|
|
113
|
-
process.env.UPLOAD_PORT = port;
|
|
114
|
-
}
|
|
115
|
-
const spinner = print.spin();
|
|
116
|
-
spinner.start(`Building and running project ${projectPath} on ${targetPlatform}`);
|
|
117
|
-
await system.exec(`mcconfig -d -m -p ${targetPlatform}`, {
|
|
118
|
-
cwd: projectPath,
|
|
119
|
-
process,
|
|
11
|
+
const { device = currentPlatform, port, example, listExamples = false, listDevices = false, mode = (_a = process.env.NODE_ENV) !== null && _a !== void 0 ? _a : 'development', output = filesystem.resolve(String(process.env.MODDABLE), 'build'), } = parameters.options;
|
|
12
|
+
const targetPlatform = (_b = devices_1.DEVICE_ALIAS[device]) !== null && _b !== void 0 ? _b : device;
|
|
13
|
+
const projectPath = filesystem.resolve((_c = parameters.first) !== null && _c !== void 0 ? _c : '.');
|
|
14
|
+
await build({
|
|
15
|
+
port,
|
|
16
|
+
listExamples,
|
|
17
|
+
listDevices,
|
|
18
|
+
example,
|
|
19
|
+
targetPlatform,
|
|
20
|
+
projectPath,
|
|
21
|
+
mode,
|
|
22
|
+
deployStatus: 'run',
|
|
23
|
+
outputDir: output,
|
|
120
24
|
});
|
|
121
|
-
spinner.stop();
|
|
122
|
-
if (targetPlatform === 'wasm') {
|
|
123
|
-
const buildName = String(projectPath.split('/').pop());
|
|
124
|
-
const debugPath = filesystem.resolve(String(process.env.MODDABLE), 'build', 'bin', 'wasm', 'debug', buildName);
|
|
125
|
-
(0, http_1.createServer)((req, res) => {
|
|
126
|
-
void (0, serve_handler_1.default)(req, res, { public: debugPath });
|
|
127
|
-
}).listen(8080, () => {
|
|
128
|
-
print.info('Started server on port 8080, go to http://localhost:8080 in your browser to view the simulator');
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
process.exit(0);
|
|
133
|
-
}
|
|
134
25
|
},
|
|
135
26
|
};
|
|
136
27
|
exports.default = command;
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJCQUF5QztBQUV6Qyx1REFBd0Q7QUFjeEQsTUFBTSxPQUFPLEdBQWlDO0lBQzVDLElBQUksRUFBRSxLQUFLO0lBQ1gsV0FBVyxFQUFFLHdEQUF3RDtJQUNyRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFOztRQUMvQyxNQUFNLGVBQWUsR0FBVyxJQUFBLFNBQVksR0FBRSxDQUFDLFdBQVcsRUFBWSxDQUFBO1FBQ3RFLE1BQU0sRUFDSixNQUFNLEdBQUcsZUFBZSxFQUN4QixJQUFJLEVBQ0osT0FBTyxFQUNQLFlBQVksR0FBRyxLQUFLLEVBQ3BCLFdBQVcsR0FBRyxLQUFLLEVBQ25CLElBQUksR0FBRyxNQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBaUIsbUNBQUksYUFBYSxFQUN0RCxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsR0FDbkUsR0FBZSxVQUFVLENBQUMsT0FBTyxDQUFBO1FBQ2xDLE1BQU0sY0FBYyxHQUFXLE1BQUEsc0JBQVksQ0FBQyxNQUFNLENBQUMsbUNBQUksTUFBTSxDQUFBO1FBQzdELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBQSxVQUFVLENBQUMsS0FBSyxtQ0FBSSxHQUFHLENBQUMsQ0FBQTtRQUUvRCxNQUFNLEtBQUssQ0FBQztZQUNWLElBQUk7WUFDSixZQUFZO1lBQ1osV0FBVztZQUNYLE9BQU87WUFDUCxjQUFjO1lBQ2QsV0FBVztZQUNYLElBQUk7WUFDSixZQUFZLEVBQUUsS0FBSztZQUNuQixTQUFTLEVBQUUsTUFBTTtTQUNsQixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
|
package/build/commands/setup.js
CHANGED
|
@@ -11,7 +11,7 @@ const command = {
|
|
|
11
11
|
description: 'Download and build Moddable tooling for various platform targets',
|
|
12
12
|
run: async ({ parameters, setup, prompt, print }) => {
|
|
13
13
|
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
14
|
-
const { device, listDevices = false, tool, } = parameters.options;
|
|
14
|
+
const { device, listDevices = false, tool, targetBranch = 'latest-release', } = parameters.options;
|
|
15
15
|
let target = device !== null && device !== void 0 ? device : currentPlatform;
|
|
16
16
|
if (device === undefined && listDevices) {
|
|
17
17
|
const choices = [
|
|
@@ -45,8 +45,8 @@ const command = {
|
|
|
45
45
|
await (0, fontbm_1.default)();
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
|
-
await setup[target]();
|
|
48
|
+
await setup[target]({ targetBranch });
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
51
|
exports.default = command;
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwyQkFBeUM7QUFFekMscUVBQWlEO0FBQ2pELHVEQUF3RDtBQVN4RCxNQUFNLE9BQU8sR0FBaUM7SUFDNUMsSUFBSSxFQUFFLE9BQU87SUFDYixXQUFXLEVBQ1Qsa0VBQWtFO0lBQ3BFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQ2xELE1BQU0sZUFBZSxHQUFXLElBQUEsU0FBWSxHQUFFLENBQUMsV0FBVyxFQUFZLENBQUE7UUFDdEUsTUFBTSxFQUNKLE1BQU0sRUFDTixXQUFXLEdBQUcsS0FBSyxFQUNuQixJQUFJLEVBQ0osWUFBWSxHQUFHLGdCQUFnQixHQUNoQyxHQUFpQixVQUFVLENBQUMsT0FBTyxDQUFBO1FBQ3BDLElBQUksTUFBTSxHQUFXLE1BQU0sYUFBTixNQUFNLGNBQU4sTUFBTSxHQUFJLGVBQWUsQ0FBQTtRQUU5QyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksV0FBVyxFQUFFO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHO2dCQUNkLFNBQVM7Z0JBQ1QsT0FBTztnQkFDUCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sc0JBQVksQ0FBQyxlQUFlLENBQUM7YUFDOUIsQ0FBQTtZQUNELE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNsRDtvQkFDRSxJQUFJLEVBQUUsY0FBYztvQkFDcEIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsT0FBTyxFQUFFLHdDQUF3QztvQkFDakQsT0FBTztpQkFDUjthQUNGLENBQUMsQ0FBQTtZQUVGLElBQUksY0FBYyxLQUFLLEVBQUUsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUN6RCxNQUFNLEdBQUcsY0FBd0IsQ0FBQTthQUNsQztpQkFBTTtnQkFDTCxLQUFLLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7Z0JBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDaEI7U0FDRjtRQUVELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUE7Z0JBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDaEI7WUFDRCxNQUFNLElBQUEsZ0JBQVcsR0FBRSxDQUFBO1lBQ25CLE9BQU07U0FDUDtRQUVELE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
|
package/build/commands/update.js
CHANGED
|
@@ -6,9 +6,9 @@ const command = {
|
|
|
6
6
|
description: 'Check and update Moddable tooling for various platform targets',
|
|
7
7
|
run: async ({ parameters, update }) => {
|
|
8
8
|
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
9
|
-
const { device = currentPlatform } = parameters.options;
|
|
10
|
-
await update[device]();
|
|
9
|
+
const { device = currentPlatform, targetBranch = 'latest-release', } = parameters.options;
|
|
10
|
+
await update[device]({ targetBranch });
|
|
11
11
|
},
|
|
12
12
|
};
|
|
13
13
|
exports.default = command;
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3VwZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJCQUF5QztBQVF6QyxNQUFNLE9BQU8sR0FBaUM7SUFDNUMsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQUUsZ0VBQWdFO0lBQzdFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUNwQyxNQUFNLGVBQWUsR0FBVyxJQUFBLFNBQVksR0FBRSxDQUFDLFdBQVcsRUFBWSxDQUFBO1FBQ3RFLE1BQU0sRUFDSixNQUFNLEdBQUcsZUFBZSxFQUN4QixZQUFZLEdBQUcsZ0JBQWdCLEdBQ2hDLEdBQWtCLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDckMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7Q0FDRixDQUFBO0FBRUQsa0JBQWUsT0FBTyxDQUFBIn0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("../toolbox/build/index");
|
|
4
|
+
exports.default = async (toolbox) => {
|
|
5
|
+
toolbox.build = index_1.build;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZXh0ZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dGVuc2lvbnMvYnVpbGQtZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0RBQThDO0FBRTlDLGtCQUFlLEtBQUssRUFBRSxPQUFxQixFQUFpQixFQUFFO0lBQzVELE9BQU8sQ0FBQyxLQUFLLEdBQUcsYUFBSyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,145 @@
|
|
|
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.build = void 0;
|
|
7
|
+
const serve_handler_1 = __importDefault(require("serve-handler"));
|
|
8
|
+
const http_1 = require("http");
|
|
9
|
+
const gluegun_1 = require("gluegun");
|
|
10
|
+
const choices_1 = require("../prompt/choices");
|
|
11
|
+
async function build({ listDevices, port, example, listExamples, projectPath, targetPlatform, mode, deployStatus, outputDir, }) {
|
|
12
|
+
var _a;
|
|
13
|
+
if (listDevices) {
|
|
14
|
+
const choices = [
|
|
15
|
+
'esp',
|
|
16
|
+
'esp/moddable_zero',
|
|
17
|
+
'esp/moddable_one',
|
|
18
|
+
'esp/moddable_three',
|
|
19
|
+
'esp/nodemcu',
|
|
20
|
+
'esp32',
|
|
21
|
+
'esp32/moddable_two',
|
|
22
|
+
'esp32/nodemcu',
|
|
23
|
+
'esp32/m5stack',
|
|
24
|
+
'esp32/m5stack_core2',
|
|
25
|
+
'esp32/m5stick_fire',
|
|
26
|
+
'esp32/m5atom_echo',
|
|
27
|
+
'esp32/m5atom_lite',
|
|
28
|
+
'esp32/m5atom_matrix',
|
|
29
|
+
'esp32/m5paper',
|
|
30
|
+
'esp32/m5core_ink',
|
|
31
|
+
'esp32/heltec_wifi_kit_32',
|
|
32
|
+
'esp32/esp32_thing',
|
|
33
|
+
'esp32/esp32_thing_plus',
|
|
34
|
+
'esp32/wrover_kit',
|
|
35
|
+
'esp32/kaluga',
|
|
36
|
+
'esp32/saola_wroom',
|
|
37
|
+
'esp32/saola_wrover',
|
|
38
|
+
'wasm',
|
|
39
|
+
'pico',
|
|
40
|
+
'pico/ili9341',
|
|
41
|
+
'pico/pico_display',
|
|
42
|
+
'pico/pico_display_2',
|
|
43
|
+
'simulator/moddable_one',
|
|
44
|
+
'simulator/moddable_two',
|
|
45
|
+
'simulator/moddable_three',
|
|
46
|
+
'simulator/m5stickc',
|
|
47
|
+
'simulator/m5paper',
|
|
48
|
+
'simulator/nodemcu',
|
|
49
|
+
'simulator/pico_display',
|
|
50
|
+
'simulator/pico_display_2',
|
|
51
|
+
];
|
|
52
|
+
const { device: selectedDevice } = await gluegun_1.prompt.ask([
|
|
53
|
+
{
|
|
54
|
+
type: 'autocomplete',
|
|
55
|
+
name: 'device',
|
|
56
|
+
message: 'Here are the available target devices:',
|
|
57
|
+
choices,
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
if (selectedDevice !== '' && selectedDevice !== undefined) {
|
|
61
|
+
targetPlatform = selectedDevice;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
gluegun_1.print.warning('Please select a target device to run');
|
|
65
|
+
process.exit(0);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (listExamples) {
|
|
69
|
+
const exampleProjectPath = gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'examples');
|
|
70
|
+
const examples = (_a = gluegun_1.filesystem.inspectTree(exampleProjectPath)) === null || _a === void 0 ? void 0 : _a.children;
|
|
71
|
+
const choices = examples !== undefined
|
|
72
|
+
? examples.map((example) => (0, choices_1.collectChoicesFromTree)(example)).flat()
|
|
73
|
+
: [];
|
|
74
|
+
const { example: selectedExample } = await gluegun_1.prompt.ask([
|
|
75
|
+
{
|
|
76
|
+
type: 'autocomplete',
|
|
77
|
+
name: 'example',
|
|
78
|
+
message: 'Here are the available examples:',
|
|
79
|
+
choices,
|
|
80
|
+
},
|
|
81
|
+
]);
|
|
82
|
+
if (selectedExample !== '' && selectedExample !== undefined) {
|
|
83
|
+
gluegun_1.print.info(`Running the example: xs-dev run --example ${selectedExample}`);
|
|
84
|
+
projectPath = gluegun_1.filesystem.resolve(exampleProjectPath, selectedExample);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
gluegun_1.print.warning('Please select an example to run.');
|
|
88
|
+
process.exit(0);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (example !== undefined) {
|
|
92
|
+
const exampleProjectPath = gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'examples', example);
|
|
93
|
+
if (gluegun_1.filesystem.exists(exampleProjectPath) === false) {
|
|
94
|
+
gluegun_1.print.error('Example project does not exist.');
|
|
95
|
+
gluegun_1.print.info(`Lookup the available examples: xs-dev run --list-examples`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
if (gluegun_1.filesystem.exists(gluegun_1.filesystem.resolve(exampleProjectPath, 'manifest.json')) === false) {
|
|
99
|
+
gluegun_1.print.error('Example project must contain a manifest.json.');
|
|
100
|
+
gluegun_1.print.info(`Lookup the available examples: xs-dev run --list-examples`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
projectPath = exampleProjectPath;
|
|
104
|
+
}
|
|
105
|
+
if (port !== undefined) {
|
|
106
|
+
process.env.UPLOAD_PORT = port;
|
|
107
|
+
}
|
|
108
|
+
const spinner = gluegun_1.print.spin();
|
|
109
|
+
spinner.start(`Building${deployStatus !== 'none' ? ' and deploying project' : ''} ${projectPath} on ${targetPlatform}`);
|
|
110
|
+
const configArgs = [
|
|
111
|
+
'-m',
|
|
112
|
+
`-p ${targetPlatform}`,
|
|
113
|
+
`-t ${deployStatus === 'run' ? 'all' : 'build'}`,
|
|
114
|
+
`-o ${outputDir}`,
|
|
115
|
+
];
|
|
116
|
+
if (mode === 'development')
|
|
117
|
+
configArgs.push('-d');
|
|
118
|
+
if (mode === 'production')
|
|
119
|
+
configArgs.push('-i');
|
|
120
|
+
await gluegun_1.system.exec(`mcconfig ${configArgs.join(' ')}`, {
|
|
121
|
+
cwd: projectPath,
|
|
122
|
+
process,
|
|
123
|
+
});
|
|
124
|
+
if (deployStatus === 'push') {
|
|
125
|
+
await gluegun_1.system.exec(`mcconfig -t deploy -p ${targetPlatform} -o ${outputDir}`, {
|
|
126
|
+
cwd: projectPath,
|
|
127
|
+
process,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
spinner.stop();
|
|
131
|
+
if (deployStatus !== 'none' && targetPlatform === 'wasm') {
|
|
132
|
+
const buildName = String(projectPath.split('/').pop());
|
|
133
|
+
const debugPath = gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'bin', 'wasm', 'debug', buildName);
|
|
134
|
+
(0, http_1.createServer)((req, res) => {
|
|
135
|
+
void (0, serve_handler_1.default)(req, res, { public: debugPath });
|
|
136
|
+
}).listen(8080, () => {
|
|
137
|
+
gluegun_1.print.info('Started server on port 8080, go to http://localhost:8080 in your browser to view the simulator');
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
process.exit(0);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.build = build;
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC9idWlsZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrRUFBbUM7QUFDbkMsK0JBQW1DO0FBQ25DLHFDQUEyRDtBQUMzRCwrQ0FBMEQ7QUFnQm5ELEtBQUssVUFBVSxLQUFLLENBQUMsRUFDMUIsV0FBVyxFQUNYLElBQUksRUFDSixPQUFPLEVBQ1AsWUFBWSxFQUNaLFdBQVcsRUFDWCxjQUFjLEVBQ2QsSUFBSSxFQUNKLFlBQVksRUFDWixTQUFTLEdBQ0M7O0lBQ1YsSUFBSSxXQUFXLEVBQUU7UUFDZixNQUFNLE9BQU8sR0FBRztZQUNkLEtBQUs7WUFDTCxtQkFBbUI7WUFDbkIsa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQixhQUFhO1lBQ2IsT0FBTztZQUNQLG9CQUFvQjtZQUNwQixlQUFlO1lBQ2YsZUFBZTtZQUNmLHFCQUFxQjtZQUNyQixvQkFBb0I7WUFDcEIsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQixxQkFBcUI7WUFDckIsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQiwwQkFBMEI7WUFDMUIsbUJBQW1CO1lBQ25CLHdCQUF3QjtZQUN4QixrQkFBa0I7WUFDbEIsY0FBYztZQUNkLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsTUFBTTtZQUNOLE1BQU07WUFDTixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLHFCQUFxQjtZQUNyQix3QkFBd0I7WUFDeEIsd0JBQXdCO1lBQ3hCLDBCQUEwQjtZQUMxQixvQkFBb0I7WUFDcEIsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQix3QkFBd0I7WUFDeEIsMEJBQTBCO1NBQzNCLENBQUE7UUFDRCxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUM7WUFDbEQ7Z0JBQ0UsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLElBQUksRUFBRSxR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
|
|
@@ -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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
|