xs-dev 0.16.0 → 0.17.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/build/commands/build.js +30 -0
- package/build/commands/run.js +15 -124
- package/build/extensions/build-extension.js +7 -0
- package/build/toolbox/build/index.js +145 -0
- 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/types.d.ts +3 -1
- package/docs/public/run-hello-world.png +0 -0
- package/docs/src/config.ts +3 -0
- package/docs/src/pages/en/features/run.md +29 -2
- package/docs/src/pages/en/guide/00-prepare.md +50 -0
- package/docs/src/pages/en/guide/01-hello-console.md +62 -0
- package/package.json +1 -1
|
@@ -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
|
|
@@ -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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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare type DeployStatus = 'none' | 'run' | 'push';
|
|
2
|
+
export interface BuildArgs {
|
|
3
|
+
port?: string;
|
|
4
|
+
example?: string;
|
|
5
|
+
listExamples: boolean;
|
|
6
|
+
listDevices: boolean;
|
|
7
|
+
projectPath: string;
|
|
8
|
+
targetPlatform: string;
|
|
9
|
+
mode: 'development' | 'production';
|
|
10
|
+
deployStatus: DeployStatus;
|
|
11
|
+
outputDir: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function build({ listDevices, port, example, listExamples, projectPath, targetPlatform, mode, deployStatus, outputDir, }: BuildArgs): Promise<void>;
|
package/build/types/types.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { GluegunToolbox } from 'gluegun';
|
|
2
|
-
import { SetupArgs } from './toolbox/setup/types';
|
|
2
|
+
import type { SetupArgs } from './toolbox/setup/types';
|
|
3
|
+
import type { BuildArgs } from './toolbox/build/index';
|
|
3
4
|
export declare type Device = 'darwin' | 'linux' | 'windows_nt' | 'esp' | 'esp8266' | 'esp32' | 'wasm' | 'pico';
|
|
4
5
|
export interface XSDevToolbox extends GluegunToolbox {
|
|
5
6
|
setup: Record<Device, (() => Promise<void>) | ((args: SetupArgs) => Promise<void>)>;
|
|
6
7
|
update: Record<Device, (() => Promise<void>) | ((args: SetupArgs) => Promise<void>)>;
|
|
8
|
+
build: (args: BuildArgs) => Promise<void>;
|
|
7
9
|
}
|
|
Binary file
|
package/docs/src/config.ts
CHANGED
|
@@ -39,5 +39,8 @@ export const SIDEBAR = {
|
|
|
39
39
|
{ text: 'Project Creation', link: 'en/features/init' },
|
|
40
40
|
{ text: 'Build & Run', link: 'en/features/run' },
|
|
41
41
|
{ text: 'SDK Module Management', link: 'en/features/include' },
|
|
42
|
+
{ text: 'Guide', header: true },
|
|
43
|
+
{ text: '00. Prepare', link: 'en/guide/00-prepare' },
|
|
44
|
+
{ text: '01. Hello Console', link: 'en/guide/01-hello-console' },
|
|
42
45
|
],
|
|
43
46
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Run
|
|
2
|
+
title: Build and Run
|
|
3
3
|
description: Build and run Moddable projects or examples
|
|
4
4
|
layout: ../../../layouts/MainLayout.astro
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Running Projects
|
|
8
8
|
|
|
9
9
|
Within a project directory, the `run` command will invoke [`mcconfig`](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#mcconfig) to generate the `make` file based on the `manifest.json` followed by building and running the project in the current environment simulator:
|
|
10
10
|
|
|
@@ -61,3 +61,30 @@ xs-dev run --port /dev/cu.usbserial-0001 --device esp8266
|
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
_This value can be discovered using the [`scan`](./scan) command._
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Building projects for release
|
|
67
|
+
|
|
68
|
+
Within a project directory, the `build` command takes the same flags as the `run` command to invoke [`mcconfig`](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#mcconfig) to generate the `make` file based on the `manifest.json` followed by only building the project for [the target device](#select-a-device-target):
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
xs-dev build --device esp32
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The build `--mode` can be set to `production` for the optimized release code or `development` for the debug-enabled release code. This will default to the `NODE_ENV` environment variable or `development` if that variable is not set.
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
xs-dev build --mode production --device esp32
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The output directory can also be set using the `--output` flag, overriding the default path of `$MODDABLE/build`, where `$MODDABLE` is the location of the Moddable tooling repo on your local filesystem.
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
xs-dev build --output ./dist --device esp32
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If you want to immediately deploy the release build, use the `--deploy` flag:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
xs-dev build --deploy --device esp32
|
|
90
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Prerequisites
|
|
3
|
+
description: Prepare for embedded JS development
|
|
4
|
+
layout: ../../../layouts/MainLayout.astro
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**Prepare for embedded JS development**
|
|
8
|
+
|
|
9
|
+
Getting started on the journey to developing embedded hardware projects with JavaScript assumes some knowledge of various technologies like the command line, text editors, package managers, and [the JavaScript programming language](https://developer.mozilla.org/en-US/docs/Web/javascript).
|
|
10
|
+
|
|
11
|
+
## Command Line
|
|
12
|
+
|
|
13
|
+
Tutorial content will reference command line utilities and jargon as part of the workflow for developing embedded JS projects. Select your operating system to learn more about this subject:
|
|
14
|
+
|
|
15
|
+
- [MacOS OR Linux](https://www.freecodecamp.org/news/command-line-for-beginners/)
|
|
16
|
+
- [Windows](https://www.freecodecamp.org/news/command-line-commands-cli-tutorial/)
|
|
17
|
+
|
|
18
|
+
Inline terminal commands will usually be formatting like the following: `echo "hello world"`
|
|
19
|
+
|
|
20
|
+
Code examples will look like the following:
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
trace('hello world')
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Text Editors
|
|
27
|
+
|
|
28
|
+
A local plain text editor is generally required for creating and editing your JavaScript projects. You can download one of the following free applications with either built-in or third-party support for JavaScript:
|
|
29
|
+
|
|
30
|
+
- [Visual Studio Code](https://code.visualstudio.com/)
|
|
31
|
+
- [Neovim](http://www.sublimetext.com/) / [Vim](https://www.vim.org/)
|
|
32
|
+
- [Sublime Text](http://www.sublimetext.com/)
|
|
33
|
+
|
|
34
|
+
These are not the only available editors, so feel free to do your own research and pick what feels right to you!
|
|
35
|
+
|
|
36
|
+
## NodeJS Package Manager (optional)
|
|
37
|
+
|
|
38
|
+
While [NodeJS](https://nodejs.org/en/) is not required for [Moddable XS](https://github.com/Moddable-OpenSource/moddable) projects, it is a dependency for installing and using the [`xs-dev` CLI](https://hipsterbrown.github.io/xs-dev/en/introduction/).
|
|
39
|
+
|
|
40
|
+
Node can be [downloaded directly from the website](https://nodejs.org/en/download/), however using one of the following version managers can help with quickly switching to recommended versions of the tooling in the future:
|
|
41
|
+
|
|
42
|
+
- [Volta](https://volta.sh/)
|
|
43
|
+
- [fnm](https://github.com/Schniz/fnm)
|
|
44
|
+
- [asdf](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin)
|
|
45
|
+
- [`pnpm env`](https://pnpm.io/cli/env)
|
|
46
|
+
|
|
47
|
+
Node comes with [npm](https://docs.npmjs.com/cli/v8/commands/npm) as the included package manager, but there are other options available if needed:
|
|
48
|
+
|
|
49
|
+
- [pnpm](https://pnpm.io/installation)
|
|
50
|
+
- [yarn](https://yarnpkg.com/)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Hello Console
|
|
3
|
+
description: How to set up the basic development environment and run your first program
|
|
4
|
+
layout: ../../../layouts/MainLayout.astro
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**How to set up the basic development environment and run your first program**
|
|
8
|
+
|
|
9
|
+
## Install the CLI
|
|
10
|
+
|
|
11
|
+
`xs-dev` can be installed globally using the [NodeJS package manager of your choice](./00-prepare#nodejs-package-manager-optional).
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
npm install -g xs-dev
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
pnpm install -g xs-dev
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
yarn global add xs-dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Setup system tooling
|
|
26
|
+
|
|
27
|
+
As specified in the [setup documentation](../features/setup), the [Moddable SDK and associated tooling](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md) is installed using the following command:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
xs-dev setup
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This will determine the correct tooling to install based on your operating system.
|
|
34
|
+
|
|
35
|
+
**[Windows support coming soon](https://github.com/HipsterBrown/xs-dev/pull/53)**
|
|
36
|
+
|
|
37
|
+
Once this process is done, you should see a success message:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Moddable SDK successfully set up! Start a new terminal session and run the "helloworld example": xs-dev run --example helloworld
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Run the Hello World example
|
|
44
|
+
|
|
45
|
+
To start a new terminal session, you can either execute your shell of choice (`bash`/`zsh`/`fish`) or create a new terminal window / tab. This will ensure the expected tooling is available in your session [PATH](https://en.wikipedia.org/wiki/PATH_(variable)).
|
|
46
|
+
|
|
47
|
+
You can [run any Moddable example included in the SDK](../features/run#moddable-examples). The "Hello World" example provides the simplest program to get started and can be run in the [simulator](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#simulator):
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
xs-dev run --example helloworld
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This will start up the debugger and simulator:
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
This will keep running until the `Ctrl+C` keys are entered in the terminal session or both apps are quit.
|
|
58
|
+
|
|
59
|
+
## Keep exploring!
|
|
60
|
+
|
|
61
|
+
Use the `--list-examples` flag with the `run` command to search the extensive list of available examples to run in the simulator: `xs-dev run --list-examples`
|
|
62
|
+
|